更方便的在微信公眾號閲讀文章可以關注公眾號:海生的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