使用protobuf
protoc
- 下载
protobuf
的编译器protoc
- 地址:
https://github.com/google/protobuf/releases
- 把
protoc.exe
复制到GOPATH/bin
下,GOPATH/bin
加入环境变量
protoc-gen-go
go get github.com/golang/protobuf/protoc-gen-go
protoc-gen-gogo
- 和protoc-gen-go生成的文件差不多,性能也几乎一样(稍微快一点点)
go get -u github.com/golang/protobuf/protoc-gen-gogo
protoc-gen-gofast
- 生成的文件更复杂,性能也更高(快5-7倍)
go get -u github.com/golang/protobuf/protoc-gen-gofast
- 注:这里我选用gofast
安装gogoprotobuf库文件
go get github.com/gogo/protobuf/proto
生成go文件
- 命令
protoc -I=path1 --gofast_out=path2 *.proto
-I
:由于proto中可能是多协议间互相引用的关系,所以要加上-I
,这样生成时会引用其它协议path1
:为生成时,需要引用的文件的路径--gofast_out
:指定生成go文件的存放路径path2
:生成go文件的存放路径*.proto
:当前文件夹下所有的.proto全都生成- 示例bat:
protoc -I=./ --gofast_out=./pb_go *.proto pause
- 示例结构
- 示例说明:结构下有5个协议,其中http.proto和websocket.proto中都引用了enum.proto、errorCode.proto、及messageCommand.proto这三个协议。上述bat文件会将这些协议全都生成到pb_go文件当中。
Proto3中引用
- 引用其它协议,要在将协议import
- 示例
- 图中引用的
MessageCommand
和ErrorCode
在别的文件中,使用前如图示引用
Proto3中的enum
- enum必需要以0开始;
- 当有意义的值为0开始时,其中传输过程中会被省略。比如
ErrorCode=0
如果表示成功,那在传输过程中,接收方可能收不到这个0值。所以建议enum值中的0值留空,有意义的值从1开始;