We are pleased to announce the release of a major revision of the Go API for protocol buffers, Google’s language-neutral data interchange format.
Motivations for a new API
The first protocol buffer bindings for Go were announced by Rob Pike in March of 2010. Go 1 would not be released for another two years.
In the decade since that first release, the package has grown and developed along with Go. Its users’ requirements have grown too.
Many people want to write programs that use reflection to examine protocol buffer messages. The
reflect package provides a view of Go types and values, but omits information from the protocol buffer type system. For example, we might want to write a function that traverses a log entry and clears any field annotated as containing sensitive data. The annotations are not part of the Go type system.
Another common desire is to use data structures other than the ones generated by the protocol buffer compiler, such as a dynamic message type capable of representing messages whose type is not known at compile time.
We also observed that a frequent source of problems was that the
proto.Message interface, which identifies values of generated message types, does very little to describe the behavior of those types. When users create types that implement that interface (often inadvertently by embedding a message in another struct) and pass values of those types to functions expecting a generated message value, programs crash or behave unpredictably.
All three of these problems have a common cause, and a common solution: The
Message interface should fully specify the behavior of a message, and functions operating on
Message values should freely accept any type that correctly implements the interface.
Since it is not possible to change the existing definition of the
Message type while keeping the package API compatible, we decided that it was time to begin work on a new, incompatible major version of the protobuf module.
Today, we’re pleased to release that new module. We hope you like it.