This is a creation in Article, where the information may have evolved or changed.
wget https://github.com/google/protobuf/releases/download/v2.6.1/protobuf-2.6.1.tar.gz
Tar zxvf protobuf-2.6.1.tar.gzcd protobuf-2.6.1
./configuremakemake Installprotoc-h
Go get github.com/golang/protobuf/protoc-gen-gocd Github.com/golang/protobuf/protoc-gen-gogo buildgo installvi/etc/ Profile add $gopath/bin to the environment variable source profile
Go get github.com/golang/protobuf/protocd github.com/golang/protobuf/protogo buildgo Install
Using Goprotobuf
Here is an example to illustrate usage. First create a. proto file Test.proto:
package example;
Enum FOO {X = 17;}; Message Test {Required String label = 1;optional Int32 type = 2 [default=77];repeated Int64 reps = 3;optional Group Option Algroup = 4 {Required String requiredfield = 5;}}
Compile this. proto file:
Protoc--go_out=. *.proto
The protobuf compiler plugin protoc-gen-go provided by GOPROTOBUF is used here through –go_out. At this point we will generate a source file named Test.pb.go.
Before using it, let's look at some of the available interfaces for each PROTOBUF message in Golang:
Each of the PROTOBUF messages corresponds to a golang struct
The domain name word in the message is camel_case in the corresponding Golang structure for CamelCase
There is no setter method in the Golang struct body of the message, it is only necessary to assign a value directly to the struct, and some auxiliary functions may be used when assigning values, for example:
Msg. Foo = Proto. String ("Hello")
The Getter method exists in the Golang struct body of the message that returns the value of the field and returns a default value if the field is not set value
Non-repeated domains are implemented as a pointer with nil when the pointer indicates that the domain is not set
The repeated domain in the message is implemented as slice
When accessing enumeration values, use the format enumerated type name _ enum name (more content can read the generated source directly)
Use Proto. The Marshal function is encoded using the proto. Unmarshal function for decoding
Now we write a small program:
package mainimport ( "Log" // Auxiliary library "Github.com/golang/protobuf/proto" // test.pb.go path "Example") Func main () { // Create a message Test test := &example. test{ // setting the value of a field using an auxiliary function label: proto. String ("Hello"), type: proto. Int32 (+), optionalgroup: &example. Test_optionalgroup{ requiredfield: proto. String ("Good bye"), }, } // encode the data, err := proto. Marshal (tesT)
If err! = Nil {log. Fatal ("Marshaling Error:", err)}//To decode newtest: = &example. test{} err = Proto. Unmarshal (data, newtest)
If err! = Nil {log. Fatal ("Unmarshaling error:", err)}//test result if tests. Getlabel ()! = Newtest.getlabel () {log. Fatalf ("Data mismatch%q! =%q", test. Getlabel (), Newtest.getlabel ())}}