[tldr] go使用protobuf

protobuf是一个附带工具生成代码并实现将结构化数据序列化的工具.

安装protobuf

参考官方文档-下载软件

在github protobuf仓库的releases页面找到新版的软件然后安装.

下载zip文件, 使用unzip指令解压就可以使用了, 可执行文件在./bin文件夹下面

./bin/
├── bin
│   └── protoc
├── include
│   └── google
│       └── protobuf
│           ├── any.proto
│           ├── api.proto
│           ├── compiler
│           │   └── plugin.proto
│           ├── cpp_features.proto
│           ├── descriptor.proto
│           ├── duration.proto
│           ├── empty.proto
│           ├── field_mask.proto
│           ├── go_features.proto
│           ├── java_features.proto
│           ├── source_context.proto
│           ├── struct.proto
│           ├── timestamp.proto
│           ├── type.proto
│           └── wrappers.proto
└── readme.txt

需要使用go install google.golang.org/protobuf/cmd/protoc-gen-go@latest下载安装二进制可执行文件用于编译代码

first example

syntax = "proto3";

option go_package = "./myproto";

package myproto;

message Hello {
  string name = 1;
}

需要一个.proto文件
这个option go_package是GO语言特定的需要的变量, 并且这个代表了go的包的名字

编译

对于一个.proto文件可以编译为二进制文件

../bin/bin/protoc --go_out=. hello.proto

会生成一个hello.pb.go文件

编译出来的文件会使用一些GO的包, 需要使用go mod tidy安装缺失的环境

使用生成的文件

Protobuf还为每个成员生成了一个Get方法

func (x *Hello) GetName() string {
	if x != nil {
		return x.Name
	}
	return ""
}

使用生成的代码进行通讯

针对server的代码

const HelloServiceName = "HelloService"

type HelloService struct{}

func (s *HelloService) Hello(request *myproto.Hello, reply *string) error {
	*reply = "Hello, " + request.GetName()
	return nil
}

会自动反序列化成为一个可以被使用的

func (c *HelloServiceClient) Hello(request *myproto.Hello, reply *string) error {
	return c.Call(c.serviceName+".Hello", request, reply)
}

针对客户端的使用, 因为每次rpc传输数据的时候自动调用String方法生成为字符串进行传输, 所以, 不需要手动调用, 直接给一个实现了String的接口即可.

总结

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

参考

GO语言高级编程

来源链接:https://www.cnblogs.com/xuhe2/p/18857531

请登录后发表评论

    没有回复内容