Go
Protobuf in Go
Zoeken…
Invoering
Protobuf of Protocol Buffer codeert en decodeert gegevens zodat verschillende toepassingen of modules die in ongelijke talen zijn geschreven, het grote aantal berichten snel en betrouwbaar kunnen uitwisselen zonder het communicatiekanaal te overbelasten. Met protobuf zijn de prestaties recht evenredig met het aantal berichten dat u wilt verzenden. Het comprimeert het bericht om een serieel binair formaat te verzenden door uw de tools te bieden om het bericht bij de bron te coderen en op de bestemming te decoderen.
Opmerkingen
Er zijn twee stappen voor het gebruik van protobuf .
- Eerst moet u de protocolbufferdefinities compileren
- Importeer de bovenstaande definities, met de ondersteuningsbibliotheek, in uw programma.
gRPC-ondersteuning
Als een proto-bestand RPC-services specificeert, kan protoc-gen-go worden geïnstrueerd om code te genereren die compatibel is met gRPC ( http://www.grpc.io/) . Geef hiervoor de parameter plugins
aan protoc-gen-go; de gebruikelijke manier is om het in te voegen in het argument --go_out om te protoceren:
protoc --go_out=plugins=grpc:. *.proto
Protobuf gebruiken met Go
Het bericht dat u wilt serialiseren en verzenden dat u kunt opnemen in een bestand test.proto , met daarin
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;
}
}
Om de protocolbufferdefinitie te compileren, voert u protoc uit met de parameter --go_out ingesteld op de map waarnaar u de Go-code wilt uitvoeren.
protoc --go_out=. *.proto
Als u een testobject uit het voorbeeldpakket wilt maken en ermee wilt spelen,
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.
}
Om extra parameters aan de plug-in door te geven, gebruikt u een door komma's gescheiden parameterlijst gescheiden van de uitvoermap door een dubbele punt:
protoc --go_out=plugins=grpc,import_path=mypackage:. *.proto