golang中使用protobuf
1、为什么使用protobuf?
protobuf 即 Protocol Buffers,Google 开发的一种数据描述语言,是一种轻便高效的结构化数据存储格式,与语言、平台无关,可扩展可序列化。protobuf 以二进制方式存储,占用空间小。
protobuf 广泛地应用于远程过程调用(RPC) 的二进制传输,使用 protobuf 的目的非常简单,为了获得更高的性能。传输前使用 protobuf 编码,接收方再进行解码,可以显著地降低二进制传输的大小。另外一方面,protobuf 可非常适合传输结构化数据,便于通信字段的扩展。
使用 protobuf 一般分为以下 2 步:
- 按照 protobuf 的语法,在
.proto
文件中定义数据结构,并使用protoc
生成 Go 代码(.proto
文件是跨平台的,还可以生成 C、Java 等其他源码文件)。 - 在项目代码中引用生成的 Go 代码。
2、protobuf安装
- 从protobuf release下载适合自己平台的压缩包
- 解压下载的压缩包
- 安装
protoc-gen-go
:go get -u github.com/golang/protobuf/protoc-gen-go
,一般会安装在GOPATH
目录下 - 在解压的文件中找到
bin
目录下的proto.xxx
(Windows平台是protoc.exe)拷贝到GOPATH/bin
目录下 - 执行
protoc --version
即可看到如下信息
3、使用protobuf
3.1、编写.proto
文件
syntax = "proto3";
package geecachepb;
message Request {
string group = 1;
string key = 2;
}
message Response {
bytes value = 1;
}
service GroupCache {
rpc Get(Request) returns (Response);
}
3.2、执行命令生成 go 代码
protoc --go_out=. *.proto
此时执行生成go代码的命令可能会看到下面这种报错信息
unable to determine Go import path for "geecachepb.proto"
解决方式:在.proto
文件中加一行,如下图
3.3、code中实现
3.3.1、发送方使用proto
编码
bytes, err := proto.Marshal(&pb.Response{Value: view.ByteSlice()})
3.3.2、接收方使用proto
解码
if err := proto.Unmarshal(bytes, out); err != nil {
return fmt.Errorf("decoding response error: %s", err.Error())
}
到此大功告成~
本作品采用《CC 协议》,转载必须注明作者和本文链接