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