GO 使用 Protobuf实用指南
本文是笔者在日常工作中使用protoc生成go文件的实用总结, 并不会详细介绍各种细节, 之后有心得则会再添加
语法
syntax = "proto3";
package pt1;
option go_package = "/pt";
// option go_package = "github.com/smallki/pt;pt";
import "common.proto";
message HelloRequest {
string username = 1;
string password = 2;
}
message HelloResponse{
string msg = 1;
}
// grpc服务
service Hello {
rpc SayHello (HelloRequest) returns(HelloResponse) {}
rpc Heart (stream HeartRequest) returns (HeartRequest){}
}
-
syntax = "proto3";
定义proto的语法格式版本, 这里使用protobuf3
-
package pt1;
package定义的是此protobuf文件所属的模块(与go无关)
之所以要定义模块是为了防止类型冲突
比如, a.proto文件定义了一个
message A
, b.proto文件也定义了一个message A
, 如果两个proto文件在同一个模块,则会冲突,不被允许我们可以让a.proto指定
package a;
b.proto指定package b;
这样就可以通过 a.A, b.A 来同时使用两个不同的类型
-
option go_package = "/pt"
指定生成的go文件的包名
go_package
有两种格式, 第一种是/
+ 包名, 这样其他包在引用生成的go文件时不会import其他包第二种是
引用包名;包名
的方式, 若如此使用, 其他proto文件在引用此包时会在生成的go文件头部加上import "引用包名"
一般情况下, 我们生成的go文件都在同一个包, 所以用第一种方式即可
-
import "common.proto";
表示此proto文件需要引用common.proto中的类型, 这样写后可以使用common.proto中定义的类型
当前这种写法是相对路径, 可以在protoc中使用
-I
参数来指定根路径
生成命令
使用protoc
程序来生成对应go文件, protoc [options] protoFile
使用 --go_out来指定生成go文件的路径, 注意protoc会根据go_package来自动生成包文件夹, 如我们指定 option go_package="/pt"
, 则会在生成目录自动创建pt文件夹
protoc --go_out=. -I . protocol/hello.proto