《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
推荐阅读
go语法入门-any类型的使用场景与注意
在没有any类型之前,go语言中,我们经常使用interface{},来表示一个类型是未知的,或者有好几种其他基础类型的情况。从 Go1.18开始,go官方定义了一个预声明标识符(Predeclared identifiers):any。
海生阅读 486
前端如何入门 Go 语言
类比法是一种学习方法,它是通过将新知识与已知知识进行比较,从而加深对新知识的理解。在学习 Go 语言的过程中,我发现,通过类比已有的前端知识,可以更好地理解 Go 语言的特性。
robin赞 23阅读 3.3k评论 6
Golang 中 []byte 与 string 转换
string 类型和 []byte 类型是我们编程时最常使用到的数据结构。本文将探讨两者之间的转换方式,通过分析它们之间的内在联系来拨开迷雾。
机器铃砍菜刀赞 24阅读 58.2k评论 2
年度最佳【golang】map详解
这篇文章主要讲 map 的赋值、删除、查询、扩容的具体执行过程,仍然是从底层的角度展开。结合源码,看完本文一定会彻底明白 map 底层原理。
去去1002赞 16阅读 11.6k评论 2
年度最佳【golang】GMP调度详解
Golang最大的特色可以说是协程(goroutine)了, 协程让本来很复杂的异步编程变得简单, 让程序员不再需要面对回调地狱, 虽然现在引入了协程的语言越来越多, 但go中的协程仍然是实现的是最彻底的. 这篇文章将通过分析...
去去1002赞 15阅读 11.9k评论 4
万字详解,吃透 MongoDB!
MongoDB 是一个基于 分布式文件存储 的开源 NoSQL 数据库系统,由 C++ 编写的。MongoDB 提供了 面向文档 的存储方式,操作起来比较简单和容易,支持“无模式”的数据建模,可以存储比较复杂的数据类型,是一款非常...
JavaGuide赞 8阅读 1.7k
数据结构与算法:二分查找
一、常见数据结构简单数据结构(必须理解和掌握)有序数据结构:栈、队列、链表。有序数据结构省空间(储存空间小)无序数据结构:集合、字典、散列表,无序数据结构省时间(读取时间快)复杂数据结构树、 堆图二...
白鲸鱼赞 9阅读 5.3k
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。