go-protobuf使用
go-protobuf使用
前篇
- Protobuf 语言指南 - https://juejin.im/post/5bb597c2e51d450e6e03e42d
安装
下载 protoc. https://github.com/protocolbuffers/protobuf/releases
下载并生成 protoc-gen-go.exe, protoc-gen-micro.exe 等 Golang for protobuf 插件
1
2$ go get -u -v github.com/golang/protobuf/proto
$ go get -u -v github.com/golang/protobuf/protoc-gen-go
生成 grpc xxx.pb.go
得先安装 grpc. 参考: grpc
执行命令所在路径为
test_grpc
1
2
3
4
5├─test_grpc
│ ├─aaa
│ ├─greeter_client
│ ├─greeter_server
│ └─protos // 所有 .proto 文件执行命令
1
protoc --go_out=plugins=grpc:aaa -I .\protos ./protos/helloworld.proto
-I .\protos
: 指定 依赖路径, 因为 proto 文件在同一文件夹内必须是相同 package (相同模块), 如果依赖了其他模块需要指定-I
参数指定搜索路径- 奇怪的是带上
-I
参数, 则会在输出目录 aaa 下直接生成 xxx.pb.go, 不带-I
参数则会生成多一级目录, 也就是 aaa/protos/xxx.pb.go
- 奇怪的是带上
.\protos\helloworld.proto
: 指定要生成的文件为protos\helloworld.proto
文件- 如果该模块有多个 proto 文件需要转换的话, 可以使用
./protos/*.proto
, 会匹配生成多个 xxx.pb.go 文件 - 也可以分别制定多个 proto 文件, 用空格隔开.
./protos/aaa.proto ./protos/bbb.proto
- 如果该模块有多个 proto 文件需要转换的话, 可以使用
--go_out=plugins=grpc:aaa
: 输出文件 到 aaa (必须已经存在) 目录下, 格式为 go 语言的 grpc 格式- 如果生成普通的 xxx.pb.go 的话, 使用 protoc-gen-go, 则为:
--go_out=plugins=protoc-gen-go:bbb
- 如果生成普通的 xxx.pb.go 的话, 使用 protoc-gen-go, 则为:
结果: 会在 aaa 文件夹下生成 xxx.pb.go 文件
生成 普通 xxx.pb.go
执行命令. ( protoc-gen-go.exe 已经在环境变量中, 且输出目录 bbb 已经存在 )
1
protoc -I .\protos\ --go_out=plugins=protoc-gen-go:bbb ./protos/helloworld.proto
gogofaster 插件
- proto2 默认是生成的字段都是 指针类型 - https://github.com/golang/protobuf/issues/22
使用 gogofaster 插件可以生成 值类型 的字段
下载并生成
protoc-gen-gogofaster
插件1
$ go install github.com/gogo/protobuf/protoc-gen-gogofaster@latest
- 要加上版本号, 否则报错:
'go install' requires a version when current directory is not in a module
- 要加上版本号, 否则报错:
生成
.pb.go
1
$ protoc -I ./src --gogofaster_out=protoc-gen-gogofaster:./gen ./src/*.proto
csharp 踩坑
数据结构名 和 里面的字段名不要重名, 不然导出来的 cs 文件会编译报错
1
2
3
4message RoomAddr{
optional uint32 GameId = 1;//大厅内不同游戏GameID
optional string RoomAddr = 2;
}