Protocol Buffers (protobuf)是Google的跨语言、跨平台、可扩展的结构化数据序列化机制。可以在谷歌开发者网站上找到protobuf的文档。
下载protobuf及go插件
protobuf 下载地址:
https://github.com/protocolbuffers/protobuf/releases
protobuf go语言插件,新分支下载地址:
https://github.com/protocolbuffers/protobuf-go/releases
protobuf go语言插件,旧分支仓库地址:
https://github.com/golang/protobuf
注意:github.com/golang/protobuf 1.4及之后的版本其实都是新分支了,如果需要用旧分支的版本,还是选择1.4之前的版本吧。This module (github.com/golang/protobuf) contains Go bindings for protocol buffers.It has been superseded by the google.golang.org/protobuf module, which contains an updated and simplified API, support for protobuf reflection, and many other improvements. We recommend that new code use the google.golang.org/protobuf module.
编译生成protoc-gen-go
如果是新分支,不需要编译,直接下载需要的版本就好了。
旧分支编译,这里使用1.3.5的版本。下载地址:https://github.com/golang/protobuf/tags
编译前,需要安装配置GO环境,这里就不在赘述
解压protobuf-1.3.5.zip,在protoc-gen-go文件夹下,运行 go build , 生成protoc-gen-go.exe
生成.pg.go文件
版本 protocolbuffers 3.15.8 protoc-gen-go 1.3.5
同一文件夹下,放入protoc.exe,protoc-gen-go.exe,demo.proto。
demo.proto 内容如下:
// 指定语法类型为proto2 proto3更好
syntax = "proto2";
// 逻辑包名 无层级
package demo;
message Demo {
// required 必填
required string name = 1;
//optional 可选
optional int32 age = 2;
//repeated 数组
repeated string email = 3;
}
执行 protoc --go_out=./ ./demo.proto
即可在当前目录下生成 demo.pb.go 文件
import 导入其他目录下proto
文件目录如下
/AAA
/AAA/person.proto
/BBB
/BBB/info.proto
/common.proto
/go-protoc.bat
/protoc.exe
/protoc-gen-go.exe
person.proto 需要导入 上层文件夹的common.proto 和 另一文件夹的info.proto
go-protoc.bat 脚本如下
rem -I 引入需要的proto --go_out 指定生成的路径 后面拼接go_package指定的路径
rem ./AAA/person.proto 选择要生成的proto文件
protoc -I ./ -I ./BBB --go_out=../ ./AAA/person.proto
文件内容如下:
person.proto:
// 指定语法类型为proto2 proto3更好
syntax = "proto2";
// 逻辑包名 无层级
package person;
//导入proto文件
import "common.proto";
import "info.proto";
//go的包路径 ;后 可以指定包名 通常应该为一样
option go_package = "ProtobufDemo/aaa;person";
message Person {
optional common.Common com = 1;
optional info.Info info = 2;
optional string desc = 3;
}
common.proto:
// 指定语法类型为proto2 proto3更好
syntax = "proto2";
// 逻辑包名 无层级
package common;
//go的包路径 ;后 可以指定包名 通常应该为一样
option go_package = "protobufdemo;protobufdemo";
message Common {
// required 必填
required string name = 1;
//optional 可选
optional int32 age = 2;
//repeated 数组
repeated string email = 3;
}
info.proto :
// 指定语法类型为proto2 proto3更好
syntax = "proto2";
// 逻辑包名 无层级
package info;
//go的包路径 ;后 可以指定包名 通常应该为一样
option go_package = "protobufdemo/bbb;bbb";
message Info {
optional string Info = 1;
}