博客 / 詳情

返回

《go入門grpc》第五章:protoc生成的.pb.go文件解讀

更方便的在微信公眾號閲讀文章可以關注公眾號:海生的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
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.