MCPcopy
hub / github.com/protocolbuffers/protobuf-go

github.com/protocolbuffers/protobuf-go @v1.36.11 sqlite

repository ↗ · DeepWiki ↗ · release v1.36.11 ↗
32,139 symbols 76,237 edges 490 files 3,165 documented · 10%
README

Go support for Protocol Buffers

Go Reference Build Status

This project hosts the Go implementation for protocol buffers, which is a language-neutral, platform-neutral, extensible mechanism for serializing structured data. The protocol buffer language is a language for specifying the schema for structured data. This schema is compiled into language specific bindings. This project provides both a tool to generate Go code for the protocol buffer language, and also the runtime implementation to handle serialization of messages in Go. See the protocol buffer developer guide for more information about protocol buffers themselves.

This project is comprised of two components:

See the developer guide for protocol buffers in Go for a general guide for how to get started using protobufs in Go.

This project is the second major revision of the Go protocol buffer API implemented by the google.golang.org/protobuf module. The first major version is implemented by the github.com/golang/protobuf module.

Package index

Summary of the packages provided by this module:

  • proto: Package proto provides functions operating on protobuf messages such as cloning, merging, and checking equality, as well as binary serialization.
  • encoding/protojson: Package protojson serializes protobuf messages as JSON.
  • encoding/prototext: Package prototext serializes protobuf messages as the text format.
  • encoding/protowire: Package protowire parses and formats the low-level raw wire encoding. Most users should use package proto to serialize messages in the wire format.
  • reflect/protoreflect: Package protoreflect provides interfaces to dynamically manipulate protobuf messages.
  • reflect/protoregistry: Package protoregistry provides data structures to register and lookup protobuf descriptor types.
  • reflect/protodesc: Package protodesc provides functionality for converting descriptorpb.FileDescriptorProto messages to/from the reflective protoreflect.FileDescriptor.
  • reflect/protopath: Package protopath provides a representation of a sequence of protobuf reflection operations on a message.
  • reflect/protorange: Package protorange provides functionality to traverse a protobuf message.
  • testing/protocmp: Package protocmp provides protobuf specific options for the cmp package.
  • testing/protopack: Package protopack aids manual encoding and decoding of the wire format.
  • testing/prototest: Package prototest exercises the protobuf reflection implementation for concrete message types.
  • types/dynamicpb: Package dynamicpb creates protobuf messages at runtime from protobuf descriptors.
  • types/known/anypb: Package anypb is the generated package for google/protobuf/any.proto.
  • types/known/timestamppb: Package timestamppb is the generated package for google/protobuf/timestamp.proto.
  • types/known/durationpb: Package durationpb is the generated package for google/protobuf/duration.proto.
  • types/known/wrapperspb: Package wrapperspb is the generated package for google/protobuf/wrappers.proto.
  • types/known/structpb: Package structpb is the generated package for google/protobuf/struct.proto.
  • types/known/fieldmaskpb: Package fieldmaskpb is the generated package for google/protobuf/field_mask.proto.
  • types/known/apipb: Package apipb is the generated package for google/protobuf/api.proto.
  • types/known/typepb: Package typepb is the generated package for google/protobuf/type.proto.
  • types/known/sourcecontextpb: Package sourcecontextpb is the generated package for google/protobuf/source_context.proto.
  • types/known/emptypb: Package emptypb is the generated package for google/protobuf/empty.proto.
  • types/descriptorpb: Package descriptorpb is the generated package for google/protobuf/descriptor.proto.
  • types/pluginpb: Package pluginpb is the generated package for google/protobuf/compiler/plugin.proto.
  • compiler/protogen: Package protogen provides support for writing protoc plugins.
  • cmd/protoc-gen-go: The protoc-gen-go binary is a protoc plugin to generate a Go protocol buffer package.

Reporting issues

The issue tracker for this project is currently located at golang/protobuf.

Please report any issues there with a sufficient description of the bug or feature request. Bug reports should ideally be accompanied by a minimal reproduction of the issue. Irreproducible bugs are difficult to diagnose and fix (and likely to be closed after some period of time). Bug reports must specify the version of the Go protocol buffer module and also the version of the protocol buffer toolchain being used.

Contributing

This project is open-source and accepts contributions. See the contribution guide for more information.

Compatibility

This module and the generated code are expected to be stable over time. However, we reserve the right to make breaking changes without notice for the following reasons:

  • Security: A security issue in the specification or implementation may come to light whose resolution requires breaking compatibility. We reserve the right to address such issues.
  • Unspecified behavior: There are some aspects of the protocol buffer specification that are undefined. Programs that depend on unspecified behavior may break in future releases.
  • Specification changes: It may become necessary to address an inconsistency, incompleteness, or change in the protocol buffer specification, which may affect the behavior of existing programs. We reserve the right to address such changes.
  • Bugs: If a package has a bug that violates correctness, a program depending on the buggy behavior may break if the bug is fixed. We reserve the right to fix such bugs.
  • Generated additions: We reserve the right to add new declarations to generated Go packages of .proto files. This includes declared constants, variables, functions, types, fields in structs, and methods on types. This may break attempts at injecting additional code on top of what is generated by protoc-gen-go. Such practice is not supported by this project.
  • Internal changes: We reserve the right to add, modify, and remove internal code, which includes all unexported declarations, the protoc-gen-go/internal_gengo package, the runtime/protoimpl package, and all packages under internal.

Any breaking changes outside of these will be announced 6 months in advance to protobuf@googlegroups.com.

Users should use generated code produced by a version of protoc-gen-go that is identical to the runtime version provided by the protobuf module. This project promises that the runtime remains compatible with code produced by a version of the generator that is no older than 1 year from the version of the runtime used, according to the release dates of the minor version. Generated code is expected to use a runtime version that is at least as new as the generator used to produce it. Generated code contains references to protoimpl.EnforceVersion to statically ensure that the generated code and runtime do not drift sufficiently far apart.

Historical legacy

This project is the second major revision (released in 2020) of the Go protocol buffer API implemented by the google.golang.org/protobuf module. The first major version (released publicly in 2010) is implemented by the github.com/golang/protobuf module.

The first version predates the release of Go 1 by several years. It has a long history as one of the first core pieces of infrastructure software ever written in Go. As such, the Go protobuf project was one of many pioneers for determining what the Go language should even look like and what would eventually be considered good design patterns and “idiomatic” Go (by simultaneously being both positive and negative examples of it).

Consider the changing signature of the proto.Unmarshal function as an example of Go language and library evolution throughout the life of this project:

// 2007/09/25 - Conception of Go

// 2008/11/12
export func UnMarshal(r io.Read, pb_e reflect.Empty) *os.Error

// 2008/11/13
export func UnMarshal(buf *[]byte, pb_e reflect.Empty) *os.Error

// 2008/11/24
export func UnMarshal(buf *[]byte, pb_e interface{}) *os.Error

// 2008/12/18
export func UnMarshal(buf []byte, pb_e interface{}) *os.Error

// 2009/01/20
func UnMarshal(buf []byte, pb_e interface{}) *os.Error

// 2009/04/17
func UnMarshal(buf []byte, pb_e interface{}) os.Error

// 2009/05/22
func Unmarshal(buf []byte, pb_e interface{}) os.Error

// 2011/11/03
func Unmarshal(buf []byte, pb_e interface{}) error

// 2012/03/28 - Release of Go 1

// 2012/06/12
func Unmarshal(buf []byte, pb Message) error

These changes demonstrate the difficulty of determining what the right API is for any new technology. It takes time multiplied by many users to determine what is best; even then, “best” is often still somewhere over the horizon.

The change on June 6th, 2012 added a degree of type-safety to Go protobufs by declaring a new interface that all protobuf messages were required to implement:

type Message interface {
   Reset()
   String() string
   ProtoMessage()
}

This interface reduced the set of types that can be passed to proto.Unmarshal from the universal set of all possible Go types to those with a special ProtoMessage marker method. The intention of this change is to limit the

Extension points exported contracts — how you extend this code

List (Interface)
List is a zero-indexed, ordered list. The element [Value] type is determined by [FieldDescriptor.Kind]. Providing a [Val [8 …
reflect/protoreflect/value.go
DoNotImplement (Interface)
DoNotImplement can be embedded in an interface to prevent trivial implementations of the interface. This is useful to p [20 …
internal/pragma/pragma.go
Converter (Interface)
A Converter coverts to/from Go reflect.Value types and protobuf protoreflect.Value types. [14 implementers]
internal/impl/convert.go
FieldRanger (Interface)
FieldRnger is an interface for visiting all fields in a message. The protoreflect.Message type implements this interface [10 …
internal/order/range.go
ExtensionTypeResolver (Interface)
ExtensionTypeResolver is an interface for looking up extensions. A compliant implementation must deterministically retu [5 …
reflect/protoregistry/registry.go
MessageV1 (Interface)
(no doc) [1223 implementers]
runtime/protoiface/legacy.go
Resolver (Interface)
Resolver is the resolver used by [NewFile] to resolve dependencies. The enums and messages provided must belong to some [2 …
reflect/protodesc/desc.go
Reader (Interface)
Reader is the interface expected by [UnmarshalFrom]. It is implemented by *[bufio.Reader].
encoding/protodelim/protodelim.go

Core symbols most depended-on inside this repo

MessageStateOf
called by 2500
internal/impl/pointer_unsafe.go
StoreMessageInfo
called by 2500
internal/impl/pointer_unsafe.go
MessageOf
called by 1274
internal/impl/api_export.go
MessageStringOf
called by 1252
internal/impl/api_export.go
LoadMessageInfo
called by 1251
internal/impl/pointer_unsafe.go
P
called by 1224
compiler/protogen/protogen.go
Int32
called by 511
proto/wrappers.go
Present
called by 472
internal/impl/presence.go

Shape

Method 26,303
Struct 3,037
Function 2,003
TypeAlias 532
Interface 256
FuncType 8

Languages

Go100%

Modules by API surface

internal/testprotos/testeditions/testeditions_hybrid/test.hybrid.pb.go1,062 symbols
internal/testprotos/testeditions/testeditions_opaque/test.opaque.pb.go1,058 symbols
internal/testprotos/testeditions/testeditions_hybrid/test.hybrid_protoopaque.pb.go1,058 symbols
internal/testprotos/benchmarks/datasets/google_message3/benchmark_message3_1.pb.go771 symbols
internal/testprotos/benchmarks/datasets/google_message3/benchmark_message3_4.pb.go649 symbols
internal/testprotos/benchmarks/datasets/google_message4/benchmark_message4_1.pb.go606 symbols
internal/testprotos/benchmarks/datasets/google_message3/benchmark_message3_5.pb.go603 symbols
internal/testprotos/benchmarks/datasets/google_message3/benchmark_message3_2.pb.go599 symbols
internal/testprotos/benchmarks/datasets/google_message4/benchmark_message4.pb.go590 symbols
internal/testprotos/benchmarks/datasets/google_message3/benchmark_message3_3.pb.go588 symbols
internal/testprotos/benchmarks/datasets/google_message3/benchmark_message3_6.pb.go576 symbols
types/descriptorpb/descriptor.pb.go543 symbols

Dependencies from manifests, versioned

For agents

$ claude mcp add protobuf-go \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact