更方便的在微信公众号阅读文章可以关注公众号:海生的go花园
一、介绍
在第三章,以及第四章,我们学习了,如何把proto生产go文件。
《go入门grpc》第三章:从 proto 文件自动生成go代码
《go入门grpc》第四章:使用Makefile优化protoc命令
本章我们学习下protoc --go_out
命令 生成的.pb.go文件。
我们以user.proto 以及对应的user.pb.go 为例子。
user.proto文件代码如下:
syntax = "proto3";
package user;
option go_package = "github/hisheng/grpc-demo1/api";
message user {
int64 id = 1;
string name = 2;
}
自动生成的go文件,主要有三部分
proto文件 | .pb.go文件 | 描述 |
---|---|---|
go_package | package | 生成的包 |
message | struct | 生成的结构图 |
message | init() | init(),生成的go文件,初始化 |
user.pb.go 文件如下:
package api
......
type User struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
Id int64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"`
Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
}
......
func init() { file_api_user_proto_init() }
一、package 说明
我们在user.proto文件中
option go_package = "github/hisheng/grpc-demo1/api";
对应生产的.pb.go文件中
package api
我们可以找到规律,就是go_package填写对应的 moudle路径+包路径,就可以准确的生成
对应的 .pb.go的 package
二、struct 说明
我们在user.proto文件中
message user {
int64 id = 1;
string name = 2;
}
对应生产的.pb.go文件为
type User struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
Id int64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"`
Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
}
func (x *User) GetId() int64 {
if x != nil {
return x.Id
}
return 0
}
func (x *User) GetName() string {
if x != nil {
return x.Name
}
return ""
}
主要生成了message对应的struct,以及获取结构体属性值的方法。
以及下面的四个方法。
(x *User) Reset()
(x *User) String()
(x *User) ProtoMessage()
(x *User) ProtoReflect()
三、init() 说明
主要用来初始化,下面4个变量。
File_api_user_proto
file_api_user_proto_rawDesc
file_api_user_proto_goTypes
file_api_user_proto_depIdxs
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。