person.proto

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

home.proto

  1. syntax = "proto3";
  2. package home;
  3. option go_package = "protobuf_test/pb/home;home";
  4. message Home{
  5. string home_num = 1;
  6. }