protobuf 3使用、golang言語実装

2153 ワード

1.protobuf 3バージョンのインストール
インストールprotobuf-3.1.0バージョンをダウンロードし、F:Program Filesprotoc-3.3.0-win 32binprotoc.exeファイルパスを環境変数に追加します.
正常にインストールされたかどうかを確認し、コマンドラインに「proto--version」と入力します.
インストールに成功すると、protobufのルールに従って、転送したいデータを符号化して復号することができます.
xmlやjson形式のデータ伝送よりもprotobufはより高いデータ圧縮比と圧縮効率を有する.
2.test.protoファイル
オブジェクトに適切なプロパティを追加することに相当します.
//    
//  proto3 proto2       
syntax = "proto3";

//  ,  protoc   go   
package test;

//   
message Class {
    int32 num = 1;
    repeated Student students = 2;
}

//   
message Student {
    string name = 1;
    int32 age = 2;
    Sex sex = 3;
}

//  
enum Sex {
    MAN = 0;
    WOMAN = 1;
}

3.ファイルtestを生成する.pb.goファイル
.protoファイルが作成された後、コードで使用するのは不便です.さっきインストールしたprotoツールを使用して、コードで実際に呼び出すのに便利なクラスを生成する必要があります. 
このクラスは生成されてからprotobufとデータを交換する橋渡しになり、私たちは理解して使用することができ、protobufも識別して解析することができます.
testを生成します.pb.goファイルの後protoは必要ありませんが、後期の変更とコードの可読性のためにファイルを保持し続けます.
test.pb.go具体的なコードは貼らないで、命令は以下の通りです:protoc--go_out=.  *.proto
 
4.テストと検証
package main

import (
	"github.com/goinaction/learning/proto3-my/test"
	"github.com/gogo/protobuf/proto"
	"io/ioutil"
	"os"
	"log"
)

func write() {
	c1 := &test.Class{
		Num: 1,
		Students: []*test.Student{
			{Name: "xiaoming", Age: 21, Sex: test.Sex_MAN},
			{Name: "xiaohua", Age: 21, Sex: test.Sex_WOMAN},
			{Name: "xiaojin", Age: 21, Sex: test.Sex_MAN},
		},
	}

	//   protobuf   struct            (     )
	data, _ := proto.Marshal(c1)

	//            
	ioutil.WriteFile("test.txt", data, os.ModePerm)
}

func read() {
	//               
	data, _ := ioutil.ReadFile("test.txt")

	class := new(test.Class)

	//   protobuf          struct(  )
	proto.Unmarshal(data, class)

	log.Println(class.Num)
	for _, v := range class.Students {
		log.Println(v.Name, v.Age, v.Sex)
	}
}

func main() {
	write()
	read()
}

コード出力結果:
2018/11/02 16:18:52 1
2018/11/02 16:18:52 xiaoming 21 MAN
2018/11/02 16:18:52 xiaohua 21 WOMAN
2018/11/02 16:18:52 xiaojin 21 MAN