go-protobuf使用

go-protobuf使用


前篇


安装

  1. 下载 protoc. https://github.com/protocolbuffers/protobuf/releases

  2. 下载并生成 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
    • --go_out=plugins=grpc:aaa : 输出文件 到 aaa (必须已经存在) 目录下, 格式为 go 语言的 grpc 格式

      • 如果生成普通的 xxx.pb.go 的话, 使用 protoc-gen-go, 则为: --go_out=plugins=protoc-gen-go:bbb
    • 结果: 会在 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 插件

使用 gogofaster 插件可以生成 值类型 的字段

  1. 下载并生成 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
  2. 生成 .pb.go

    1
    $ protoc -I ./src --gogofaster_out=protoc-gen-gogofaster:./gen ./src/*.proto

csharp 踩坑

  • 数据结构名 和 里面的字段名不要重名, 不然导出来的 cs 文件会编译报错

    1
    2
    3
    4
    message RoomAddr{
    optional uint32 GameId = 1;//大厅内不同游戏GameID
    optional string RoomAddr = 2;
    }