1

更方便的在微信公众号阅读文章可以关注公众号:海生的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_packagepackage生成的包
messagestruct生成的结构图
messageinit()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

海生
104 声望26 粉丝

与黑夜里,追求那一抹萤火。