protobuf wiki:
https://github.com/golang/protobuf
1.安装ProtoBuf
下载protoBuf
git clone https://github.com/google/protobuf.git
cd protobuf/
./autogen.sh
./configure
make
sudo make install
成功需要使用protoc -h 测试
2 安装protoc-gen-go插件
它是一个go程序,编译它之后将可执行文件执行路径写入环境变量
go get github.com/golang/protobuf/protoc-gen-go
cd $GOPATH/src/github.com/golang/protubuf/protoc-gen-go/
go build
将生成的protoc-gen-go可执行文件,放在$PATH环境变量中,比如:
export PATH="/home/itcast/workspace/go/src/github.com/golang/protobuf/protoc-gen-go":$PATH
3 获取proto包
go get github.com/golang/protobuf/proto
4.使用protoBuf
protobuf的使用方法是将数据结构写入到.proto文件中,使用protoc编译器编译(间接使用了插件)得到一个新的go包,里面包含go中可以使用的数据结构和一些辅助方法。
(1)编写test.proto文件
- 在$GOPATH/src/ 创建 myproto文件夹
- 在myproto文件夹中创建test.proto文件(protobuf协议文件)
package myproto;
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 RequiredFiled = 5;
}
}
3.编译: 执行
protoc --go_out=. *.proto
生成 test.pb.go 文件
4.使用protobuf做数据格式转换
package main
import (
"fmt"
"github.com/golang/protobuf/proto"
"myproto"
)
func main() {
test := &myproto.Test{
Label: proto.String("hello"),
Type: proto.Int32(17),
Reps: []int64{1, 2, 3},
Optionalgroup: &myproto.Test_OptionalGroup{
RequiredFiled: proto.String("good bye"),
},
}
//将Struct test 转换成 protobuf
data, err := proto.Marshal(test)
if err != nil {
fmt.Println("marshaling error: ", err)
}
//得到一个新的Test结构体 newTest
newTest := &myproto.Test{}
//将protobuf 转换成 Test结构体
err = proto.Unmarshal(data, newTest)
if err != nil {
fmt.Println("unmarshaling error: ", err)
}
//将newTest的字符串序列化打出
fmt.Println(newTest.String())
//得到type字段
if test.GetType() != newTest.GetType() {
fmt.Println("type is not equal")
}
//...
}
5.一些对应关系
- message Test对为 struct 结构,其属性字段有了对应的get方法,在go中可以使用
test.GetLabel()
、test.GetType()
获取test对象的属性 - OptionalGroup对应为 struct中的内嵌struct
- proto文件中repeated属性对于slice结构
test.Reset()
可以使其所有属性置为0值- 使用Marshal和Unmarshal可以轻松的编码和解码