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即可看到如下信息
    golang中使用protobuf

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文件中加一行,如下图

golang中使用protobuf

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 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!