person.proto
//使用哪个版本来解析该文件
syntax = "proto3";
//编译后,使用person.xxxx,就可以调用
package person;
//以go.mod为基准,找到本文件路径,最后一个person为别名
//在使用编译后的文件导入时,就会用到这个路径和别名
option go_package = "protobuf_test/pb/person;person";
//导入其他包,方便使用其他包里的东西。引入了其他的包就需要在编译时也要加上其他的包
import "home/home.proto";
//建结构体,这种结构体可嵌套,可递归。这个结构体生成后可去观察到底生成了什么样子
message Person{
//1,2,3这些都是序号占位,这个文件语法先写类型后写名称
string name = 1;
int32 age = 2;
//枚举申明
enum SEX{
WOMAN = 0;
MAN = 1;
};
SEX sex = 3;
//切片申明
repeated string test_slice = 4;
//map申明
map<string, string> test_map = 5;
//申明保留字段,别人不可使用
reserved "key", "value";
//保留占位符
reserved 100;
//oneof属性,只有一个有值,其他的会被清空,不能用作数组
home.Home myhome = 6;
}
//服务中对外的方法,客户端使用这个文件,也可以知道有哪些方法可以调用
service SearchService{
rpc Search(Person) returns (Person);//传统型的,即刻响应请求的
rpc SearchStream(stream Person)returns(stream Person);//出入参均可为流
}
home.proto
syntax = "proto3";
package home;
option go_package = "protobuf_test/pb/home;home";
message Home{
string home_num = 1;
}