| Go support for Protocol Buffers - Google's data interchange format | |
| Copyright 2010 The Go Authors. | |
| http://code.google.com/p/goprotobuf/ | |
| This software implements Go bindings for protocol buffers. For | |
| information about protocol buffers themselves, see | |
| http://code.google.com/apis/protocolbuffers/ | |
| To use this software, you must first install the standard C++ | |
| implementation of protocol buffers from | |
| http://code.google.com/p/protobuf/ | |
| And of course you must also install the Go compiler and tools from | |
| http://code.google.com/p/go/ | |
| See | |
| http://golang.org/doc/install.html | |
| for details or, if you are using gccgo, follow the instructions at | |
| http://golang.org/doc/gccgo_install.html | |
| This software has two parts: a 'protocol compiler plugin' that | |
| generates Go source files that, once compiled, can access and manage | |
| protocol buffers; and a library that implements run-time support for | |
| encoding (marshaling), decoding (unmarshaling), and accessing protocol | |
| buffers. | |
| There is no support for RPC in Go using protocol buffers. It may come | |
| once a standard RPC protocol develops for protobufs. | |
| There are no insertion points in the plugin. | |
| To install this code: | |
| The simplest way is to run go get. | |
| # Grab the code from the repository and install the proto package. | |
| go get -u code.google.com/p/goprotobuf/{proto,protoc-gen-go} | |
| The compiler plugin, protoc-gen-go, will be installed in $GOBIN, | |
| defaulting to $GOPATH/bin. It must be in your $PATH for the protocol | |
| compiler, protoc, to find it. | |
| Once the software is installed, there are two steps to using it. | |
| First you must compile the protocol buffer definitions and then import | |
| them, with the support library, into your program. | |
| To compile the protocol buffer definition, run protoc with the --go_out | |
| parameter set to the directory you want to output the Go code to. | |
| protoc --go_out=. *.proto | |
| The generated files will be suffixed .pb.go. See the Test code below | |
| for an example using such a file. | |
| This repository uses the same code review mechanism as Go, so | |
| if you wish to submit changes add the equivalent of these two lines | |
| to $GOROOT/src/pkg/code.google.com/p/goprotobuf/.hg/hgrc | |
| [extensions] | |
| codereview = $GOROOT/lib/codereview/codereview.py | |
| *where $GOROOT is the expanded text, such as /usr/foo/go*. | |
| The package comment for the proto library contains text describing | |
| the interface provided in Go for protocol buffers. Here is an edited | |
| version. | |
| ========== | |
| The proto package converts data structures to and from the | |
| wire format of protocol buffers. It works in concert with the | |
| Go source code generated for .proto files by the protocol compiler. | |
| A summary of the properties of the protocol buffer interface | |
| for a protocol buffer variable v: | |
| - Names are turned from camel_case to CamelCase for export. | |
| - There are no methods on v to set fields; just treat | |
| them as structure fields. | |
| - There are getters that return a field's value if set, | |
| and return the field's default value if unset. | |
| The getters work even if the receiver is a nil message. | |
| - The zero value for a struct is its correct initialization state. | |
| All desired fields must be set before marshaling. | |
| - A Reset() method will restore a protobuf struct to its zero state. | |
| - Non-repeated fields are pointers to the values; nil means unset. | |
| That is, optional or required field int32 f becomes F *int32. | |
| - Repeated fields are slices. | |
| - Helper functions are available to aid the setting of fields. | |
| Helpers for getting values are superseded by the | |
| GetFoo methods and their use is deprecated. | |
| msg.Foo = proto.String("hello") // set field | |
| - Constants are defined to hold the default values of all fields that | |
| have them. They have the form Default_StructName_FieldName. | |
| Because the getter methods handle defaulted values, | |
| direct use of these constants should be rare. | |
| - Enums are given type names and maps from names to values. | |
| Enum values are prefixed with the enum's type name. Enum types have | |
| a String method, and a Enum method to assist in message construction. | |
| - Nested groups and enums have type names prefixed with the name of | |
| the surrounding message type. | |
| - Extensions are given descriptor names that start with E_, | |
| followed by an underscore-delimited list of the nested messages | |
| that contain it (if any) followed by the CamelCased name of the | |
| extension field itself. HasExtension, ClearExtension, GetExtension | |
| and SetExtension are functions for manipulating extensions. | |
| - Marshal and Unmarshal are functions to encode and decode the wire format. | |
| Consider file test.proto, containing | |
| package example; | |
| enum FOO { X = 17; }; | |
| message Test { | |
| required string label = 1; | |
| optional int32 type = 2 [default=77]; | |
| repeated int64 reps = 3; | |
| optional group OptionalGroup = 4 { | |
| required string RequiredField = 5; | |
| } | |
| } | |
| To build a package from test.proto and some other Go files, write a | |
| Makefile like this: | |
| include $(GOROOT)/src/Make.$(GOARCH) | |
| TARG=path/to/example | |
| GOFILES=\ | |
| test.pb.go\ | |
| other.go | |
| include $(GOROOT)/src/Make.pkg | |
| include $(GOROOT)/src/pkg/code.google.com/p/goprotobuf/Make.protobuf | |
| To create and play with a Test object from the example package, | |
| package main | |
| import ( | |
| "log" | |
| "code.google.com/p/goprotobuf/proto" | |
| "path/to/example" | |
| ) | |
| func main() { | |
| test := &example.Test { | |
| Label: proto.String("hello"), | |
| Type: proto.Int32(17), | |
| Optionalgroup: &example.Test_OptionalGroup { | |
| RequiredField: proto.String("good bye"), | |
| }, | |
| } | |
| data, err := proto.Marshal(test) | |
| if err != nil { | |
| log.Fatal("marshaling error: ", err) | |
| } | |
| newTest := &example.Test{} | |
| err = proto.Unmarshal(data, newTest) | |
| if err != nil { | |
| log.Fatal("unmarshaling error: ", err) | |
| } | |
| // Now test and newTest contain the same data. | |
| if test.GetLabel() != newTest.GetLabel() { | |
| log.Fatalf("data mismatch %q != %q", test.GetLabel(), newTest.GetLabel()) | |
| } | |
| // etc. | |
| } |