使用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開始;