Protobuf简介
Protobuf是Protocol Buffers的简称,由Google公司开发的一种数据描述语言,用于描述一种轻便高效的结构化数据存储格式,它可用于结构化数据串行化,或者说序列化。它的设计非常适用于在网络通讯中的数据载体,很适合做数据存储或 RPC 数据交换格式,它序列化出来的数据量少再加上以 K-V 的方式来存储数据,对消息的版本兼容性非常强,可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。开发者可以通过Protobuf附带的工具生成代码并实现将结构化数据序列化的功能。
Protobuf中最基本的数据单元是message,是类似Go语言中结构体的存在。在message中可以嵌套message或其它的基础数据类型的成员。
protoc安装
到 https://github.com/google/protobuf/releases 下载对应的buf,然后进行编译后,使用 protoc --version
能查看对应版本,说明安装成功。
环境变量配置
第一步:if zsh vim ~/.zshrc
; if bash vim ~/.bash_profile
第二步:source ~/.zshrc
|| source ~/.bash_profile
第三步: 查看环境变量
|
|
注意: 以上配置具体路径 GOPATH
和 GOBIN
根实际填写即可,可使用go env
查看。
编译器
Protobuf核心的工具集是C++语言开发的,官方的protoc编译器中并不支持Go语言,需要安装插件才能生成Go代码。用如下命令安装:
|
|
它提供了一个 protoc-gen-go
二进制文件,当编译器调用时传递了--go_out
命令行标志时 protoc
就会使用它。–go_out代表输出的扩展名为 .pb.go
的文件。编译器会为每个.proto文件生成一个单独的源代码文件。
注意: proto路径(使用–proto_path或-I命令行标志指定)将替换为输出路径(使用–go_out标志指定)。
扩展:
go-micro
是go语言中一个很好的微服务框架,功能完善。关于 micro
后面再做详细介绍。它也有个相对应的插件:
|
|
定义proto文件
先在 proto
目录下新建一个 hello.proto
文件:
|
|
生成原型
|
|
编译器会读取proto目录下所有后缀名为 .proto
的文件,这将会生成一个输出文件 product.pb.go
。
包
默认规则
如果一个.proto文件中有包声明,生成的源代码将会使用它来作为Go的包名,如果.proto的包名中有 .
在Go包名中会将 .
转换为 _
。举例来说proto包名 example.hello
将会生成Go包名example_hello
。
指定包名
在.proto文件中可以使用option go_package
指令来覆盖上面默认生成Go包名的规则。比如说包含如下指令的一个.proto文件:
|
|
"proto;hello"
:proto表示目录,hello
则是生成的Go源代码的包名是。
不指定包名
如果一个.proto文件中不包含package声明,生成的源代码将会使用.proto文件的文件名(去掉扩展名)作为Go包名,.会被首先转换为_。如:hello.proto
文件默认生成源文件的包名为 hello
。