《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_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

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

60 声望
18 粉丝
0 条评论
推荐阅读
go语法入门-any类型的使用场景与注意
在没有any类型之前,go语言中,我们经常使用interface{},来表示一个类型是未知的,或者有好几种其他基础类型的情况。从 Go1.18开始,go官方定义了一个预声明标识符(Predeclared identifiers):any。

海生阅读 486

前端如何入门 Go 语言
类比法是一种学习方法,它是通过将新知识与已知知识进行比较,从而加深对新知识的理解。在学习 Go 语言的过程中,我发现,通过类比已有的前端知识,可以更好地理解 Go 语言的特性。

robin23阅读 3.3k评论 6

封面图
Golang 中 []byte 与 string 转换
string 类型和 []byte 类型是我们编程时最常使用到的数据结构。本文将探讨两者之间的转换方式,通过分析它们之间的内在联系来拨开迷雾。

机器铃砍菜刀24阅读 58.2k评论 2

年度最佳【golang】map详解
这篇文章主要讲 map 的赋值、删除、查询、扩容的具体执行过程,仍然是从底层的角度展开。结合源码,看完本文一定会彻底明白 map 底层原理。

去去100216阅读 11.6k评论 2

年度最佳【golang】GMP调度详解
Golang最大的特色可以说是协程(goroutine)了, 协程让本来很复杂的异步编程变得简单, 让程序员不再需要面对回调地狱, 虽然现在引入了协程的语言越来越多, 但go中的协程仍然是实现的是最彻底的. 这篇文章将通过分析...

去去100215阅读 11.9k评论 4

万字详解,吃透 MongoDB!
MongoDB 是一个基于 分布式文件存储 的开源 NoSQL 数据库系统,由 C++ 编写的。MongoDB 提供了 面向文档 的存储方式,操作起来比较简单和容易,支持“无模式”的数据建模,可以存储比较复杂的数据类型,是一款非常...

JavaGuide8阅读 1.7k

封面图
数据结构与算法:二分查找
一、常见数据结构简单数据结构(必须理解和掌握)有序数据结构:栈、队列、链表。有序数据结构省空间(储存空间小)无序数据结构:集合、字典、散列表,无序数据结构省时间(读取时间快)复杂数据结构树、 堆图二...

白鲸鱼9阅读 5.3k

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

60 声望
18 粉丝
宣传栏