GoおよびProtocol Buffersを少し練習します(または、慣れていない人のためのクイックスタート)

Goでプロトコルバッファを使用する方法の非常に短い例。 proto3、つまり プロトコルの3番目のバージョン(現在はアルファ版)、一般化された例は2番目のバージョンにも当てはまります。 プロトコルバッファ自体の説明はありません。 しかし、なぜ引く



準備する



3番目のバージョンにはドキュメントがないため、 ここにアクセスしてダウンロードしてください。 インストール(そこではすべて簡単です)。 Goの場合、すべてがここにあります 。 インストール自体
go get -u github.com/golang/protobuf/{proto,protoc-gen-go}
      
      



~/.gitconfig



指定する場合は-f



が必要になる場合があります
 [url "ssh://git@github.com/"] insteadOf = https://github.com/
      
      



Protoclバッファにまだ慣れていない場合は、2番目のバージョンの説明があります。 3番目のバージョンについては、まだドキュメントがありませんが、それだけ満足できるものです





たとえば、数値の配列と文字列を保存し、それらを読み返します。 さらに、新しいプロジェクトのルートにいると考えます。 protoファイルは次のようになります

msg / msg.proto
 //    C/C++ /*    */ //   3,     -     syntax = "proto3"; //  ,   go-   package msg; //  ,     message Msg { //  _ = _ string key = 1; // repeated  slice repeated int64 value = 2; } /*     required   extensions  extensions  (  )  Any    */ //   Sublime   
      
      





ここで、protoファイルをコンパイルする必要があります
  protoc --go_out=. msg/*.proto
      
      





その結果、このようなファイルを取得します
msg / msg.pb.go
 //   package msg import proto "github.com/golang/protobuf/proto" var _ = proto.Marshal /*    .  ,      JSON */ type Msg struct { Key string `protobuf:"bytes,1,opt,name=key" json:"key,omitempty"` Value []int64 `protobuf:"varint,2,rep,name=value" json:"value,omitempty"` } //  ,     proto.Message func (m *Msg) Reset() { *m = Msg{} } func (m *Msg) String() string { return proto.CompactTextString(m) } func (*Msg) ProtoMessage() {} func init() { }
      
      





次に、構造を作成し、そのバイトを書き込み、それを読み戻します
main.go
 package main import ( "log" "./msg" "github.com/golang/protobuf/proto" ) func main() { //   "" msg1 := &msg.Msg{ Key: "Hello Protocol Buffers", Value: []int64{1, 2, 3, 4}, } //    data, err := proto.Marshal(msg1) if err != nil { log.Fatal("marshaling error: ", err) return } //     ? log.Printf("data length: %d", len(data)) //    msg2 := new(msg.Msg) err = proto.Unmarshal(data, msg2) if err != nil { log.Fatal("unmarshaling error: ", err) } //       if msg1.Key != msg2.Key { log.Printf("unexpected value, expected '%s', got '%s'", msg1.Key, msg2.Key) } for i := 0; i < 4; i++ { if msg1.Value[i] != msg2.Value[i] { log.Printf("unexpected value, expected %d, got %d", msg1.Value[i], msg2.Value[i]) } } log.Println("Done") }
      
      





ご覧のとおり、「蒸しカブより簡単です。」 さらに深く掘り下げてみると、「メッセージ」のタイプが最初に定義されないように「メッセージ」を保存する特定のベースを作成し、これらの「メッセージ」を特定の構造のメンバーシップに保存したい場合があります。 言い換えれば、私たちが与えたものを特定の形式で保存するライブラリを持つことです。 プロトコルバッファの3番目のバージョンであるproto3では、任意の型を格納するためにAny型が実装されています。 リリースノートにも書いてありますが、実際のところこれまでのところです。 待たなければなりません。 ただし、上記のリンクからオプションを見ると、原則が明確になります-それは実装次第です。 次のようになります。
 message Any { string type_url = 1; //  bytes value = 2; //     }
      
      





それはどういう意味ですか...しかし、長い話、 例を見てみましょう。 本質的に、これは、使用されるすべてのタイプとダブルマーシャリングの登録です。ある種のマーシャリングと、基本構造のマーシャリングです。 これはすべて、反射で乱暴に散らばっています。 はい-熟考は長い時間を要します。何もする必要はありません。 それだけです
参照先


GitHubプロトコルバッファリリース

そこに、トラッカー

Goのプロトコルバッファの1つの実装

プロトコルバッファーv2ガイド

そこで、基本的なデータ型



更新する






All Articles