首页 > 其他分享 >go语言学习-grpc2:proto文件说明

go语言学习-grpc2:proto文件说明

时间:2023-03-25 16:32:13浏览次数:42  
标签:username int32 string proto age grpc2 消息 go message

message

protobuf中定义一个消息类型是通过关键字message字段指定。

消息就是需要传输的数据格式的定义,它类似java中的class,go中的struct

message User{
    string username=1;
    int32 age=2;

}

对应生成go的结构体

type User struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Username string `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty"`
	Age      int32  `protobuf:"varint,2,opt,name=age,proto3" json:"age,omitempty"`
}

在消息中承载的数据分别对应的每一个字段,其中每个字段都有一个名字和类型。

字段规则

  • required 必填字段,不设置会导致编码解码异常
  • optional 消息可选字段
  • repeated 可重复字段,重复的值的顺序会被保留,在go中重复的会被定义为切片
message UserNew{
    string username=1;      // required字段,可以不填
    int32 age=2;          
    optional string password=3;
    repeated string addresses=4;
}

生成的格式如下:

go语言学习-grpc2:proto文件说明_字段

字段映射

go语言学习-grpc2:proto文件说明_默认值_02

go语言学习-grpc2:proto文件说明_User_03

默认值

protobuf3删除了protobuf2中用来设置默认值的default关键字,取而代之的是为各种类型定义的默认值

go语言学习-grpc2:proto文件说明_默认值_04

标识号

在消息体的定义中,每个字段都必须要有一个唯一的标识号,标识号是[0,2^29-1]范围内的一个整数

message UserNew{
    string username=1;      // required字段,可以不填
    int32 age=2;          
    optional string password=3;
    repeated string addresses=4;
}

以上为例,username=1,age=2就是标识号

定义多个消息类型

一个proto文件可以定义多个消息类型

message User{
    string username=1;
    int32 age=2;

}

message UserNew{
    string username=1;      // required字段,可以不填
    int32 age=2;          
    optional string password=3;
    repeated string addresses=4;
}


嵌套消息

可以在其他消息类型中定义,使用消息类型,如下所示中Person消息就是定义在Persioninfo消息内

message PersonInfo{
    message Person{
        string name=1;
        int32 height=2;
        repeated int32 weight=3;
    }
    repeated Person info=1;
}

//父消息类型外部重用这个消息类型,如下使用

message PersonMessage{
    PersonInfo.Person info=1;
}

嵌套多层消息

message Grandpa { //level 0
    message Father{ //level 1
        message son { //level 2
            string name=1;
            int32 age=2;
        }

    }

    message Uncle { //level1
        message Son{ //level2
            string name=1;
            int32 age=2;
        }
    }

}

定义服务service

如果要将消息类型用到RPC系统中,可以在proto文件中定义一个RPC服务接口,protocol buffer编译器会将根据选择不同的语言生成不同的服务接口代码

service SearchService{
    //rpc 服务的函数名(传入参数)返回(返回参数)
    rpc Search (SearchRequest) returns (SearchReaponse);
}

上述表示,定义了一个RPC服务,该方法接收SearchRequest返回SearchResponse

标签:username,int32,string,proto,age,grpc2,消息,go,message
From: https://blog.51cto.com/u_11555417/6149557

相关文章

  • 【golang实现即时通讯系统】(一)
    即时通讯系统1.基础server构建创建一个Server的结构体,结构体应该包含服务端的IP和端口写一个创建Server的方法创建一个启动Server函数创建一个业务链接函数serve......
  • 【入门】Go语言常量详解
    1、什么是常量?程序运行期间不可以变的量使用const定义不能修改常量的值不能打印常量的地址常量在定义时候必须赋值2、常量于变量的区别?变量的值是可以变的,常量......
  • 2023爬虫学习笔记 -- MongoDB数据库
    一、下载安装mongodb1、下载地址https://www.mongodb.com/try/download/community2、一路下一步安装,路径不要出现空格中文等特殊字符3、设置环境变量将bin目录地址放到path......
  • maven install时报错Failed to execute goal org.apache.maven.plugins:maven-surefir
    maveninstall时有两种解决办法:1.maven命令行  mvncleanpackage-Dmaven.test.skip=true 注意下路径就可以,如果是idea,那就更方便,直接在这里输入mvncleanpackage......
  • go判断文件是否存在、是否是目录
    判断文件或目录是否存在使用os.IsNotExist方法使用os.IsNotExist的前提是有一个error,且这个err类型是ErrNotExist。使用os.Stat可以获取ErrNotExist。funcExists1(pathst......
  • Go语言拼接URL路径的三种方法
    Go语言拼接URL路径有多种方法建议用ResolveReference。JoinPathJoinPath会把多个多个路径合并成一个路径,并且处理../和./,多个//合并成单个/。packagemainimport( "fmt"......
  • go语言int64整型转字符串
    go语言中string(int)会把int当成UTF-8的Unicode值,转换成对应的字符,标准库strconv是专门用来实现基本数据类型和其字符串表示的相互转换。packagemainimport( "fmt" "s......
  • Gorm 实现无限树形菜单
    原文链接:https://www.zhoubotong.site/post/91.html通常树形菜单的实现基本就是递归调用,大部分场景毕竟这种数据不多,性能倒是并不突出,下面给个demo,有兴趣的朋友可以看......
  • 【入门】Go语言变量详解
    目录一、变量赋值的几种方式1.1声明单个变量1.2声明多个变量1.3初始化变量1.4变量赋值1.5自动推导类型方式声明变量二、输出输入格式控制2.1输出格式2.1输入格式2.3......
  • go gin web应用-通过中间件形式实现通用的参数检验
    都知道gin在web开发方面应用广泛,但在参数校验上,之前写一堆POST接口的时候,每个接口的业务代码里都要去实现validate校验逻辑,感觉代码复用糟糕。为解决这问题,想到通过......