找回密码
 立即注册
首页 业界区 安全 [tldr] go使用protobuf

[tldr] go使用protobuf

劳欣笑 6 天前
protobuf是一个附带工具生成代码并实现将结构化数据序列化的工具.
安装protobuf

参考官方文档-下载软件
在github protobuf仓库的releases页面找到新版的软件然后安装.
下载zip文件, 使用unzip指令解压就可以使用了, 可执行文件在./bin文件夹下面
  1. ./bin/
  2. ├── bin
  3. │   └── protoc
  4. ├── include
  5. │   └── google
  6. │       └── protobuf
  7. │           ├── any.proto
  8. │           ├── api.proto
  9. │           ├── compiler
  10. │           │   └── plugin.proto
  11. │           ├── cpp_features.proto
  12. │           ├── descriptor.proto
  13. │           ├── duration.proto
  14. │           ├── empty.proto
  15. │           ├── field_mask.proto
  16. │           ├── go_features.proto
  17. │           ├── java_features.proto
  18. │           ├── source_context.proto
  19. │           ├── struct.proto
  20. │           ├── timestamp.proto
  21. │           ├── type.proto
  22. │           └── wrappers.proto
  23. └── readme.txt
复制代码
需要使用go install google.golang.org/protobuf/cmd/protoc-gen-go@latest下载安装二进制可执行文件用于编译代码
first example
  1. syntax = "proto3";
  2. option go_package = "./myproto";
  3. package myproto;
  4. message Hello {
  5.   string name = 1;
  6. }
复制代码
需要一个.proto文件
这个option go_package是GO语言特定的需要的变量, 并且这个代表了go的包的名字
编译

对于一个.proto文件可以编译为二进制文件
  1. ../bin/bin/protoc --go_out=. hello.proto
复制代码
会生成一个hello.pb.go文件
编译出来的文件会使用一些GO的包, 需要使用go mod tidy安装缺失的环境
使用生成的文件

Protobuf还为每个成员生成了一个Get方法
  1. func (x *Hello) GetName() string {
  2.         if x != nil {
  3.                 return x.Name
  4.         }
  5.         return ""
  6. }
复制代码
使用生成的代码进行通讯
针对server的代码
  1. const HelloServiceName = "HelloService"
  2. type HelloService struct{}
  3. func (s *HelloService) Hello(request *myproto.Hello, reply *string) error {
  4.         *reply = "Hello, " + request.GetName()
  5.         return nil
  6. }
复制代码
会自动反序列化成为一个可以被使用的
  1. func (c *HelloServiceClient) Hello(request *myproto.Hello, reply *string) error {
  2.         return c.Call(c.serviceName+".Hello", request, reply)
  3. }
复制代码
针对客户端的使用, 因为每次rpc传输数据的时候自动调用String方法生成为字符串进行传输, 所以, 不需要手动调用, 直接给一个实现了String的接口即可.
总结

protoc编译的时候还可以生成出来grpc的代码文件, 所以, 可以帮助实现rpc的函数定义等(很方便), 但这些本质是grpc的功能, 所以这里只讲关于protoc总结编译message并且在GO中使用.
参考

GO语言高级编程

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册