Go
Protobuf i Go
Sök…
Introduktion
Protobuf- eller Protocol Buffer kodar och avkodar data så att olika applikationer eller moduler skrivna på olika sätt kan utbyta det stora antalet meddelanden snabbt och pålitligt utan att överbelasta kommunikationskanalen. Med protobuf är prestandan direkt proportionell mot antalet meddelanden du tenderar att skicka. Det komprimerar meddelandet för att skicka i ett seriellt binärt format genom att ge dina verktyg för att koda meddelandet vid källan och avkoda det vid destinationen.
Anmärkningar
Det finns två steg för att använda protobuf .
- Först måste du sammanställa protokollbuffertdefinitionerna
- Importera definitionerna ovan med supportbiblioteket i ditt program.
gRPC-stöd
Om en proto-fil specificerar RPC-tjänster kan protoc-gen-go instrueras att generera kod kompatibel med gRPC ( http://www.grpc.io/) . För att göra detta, passera plugins
parameter till protoc-gen-go; det vanliga sättet är att infoga det i protokollet --go_out till protokoll:
protoc --go_out=plugins=grpc:. *.proto
Använda Protobuf med Go
Meddelandet du vill serialisera och skicka som du kan inkludera i en fil test.proto , som innehåller
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;
}
}
För att sammanställa protokollbuffertdefinitionen, kör protokoll med --go_out-parametern inställd på katalogen du vill mata ut Go-koden till.
protoc --go_out=. *.proto
För att skapa och spela med ett testobjekt från exempelpaketet,
package main
import (
"log"
"github.com/golang/protobuf/proto"
"path/to/example"
)
func main() {
test := &example.Test {
Label: proto.String("hello"),
Type: proto.Int32(17),
Reps: []int64{1, 2, 3},
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.
}
För att skicka extra parametrar till pluginprogrammet använder du en kommaseparerad parameterlista separerad från utgångskatalogen med en kolon:
protoc --go_out=plugins=grpc,import_path=mypackage:. *.proto