protobuf 2定义string常量

背景

protobuf 2中定义的enum枚举值必须为数字类型,故不支持string类型,但有些业务场景又确实需要定义string常量。

目标

在protobuf 2中定义string常量。

方案

思路:通optional + default实现string常量。
细节:

1、protobuf定义

syntax = "proto2";
package stonelu.learn.pb;message Constant {message TestStringConst {optional string NO_TEST_STRING_CONST = 1 [default = "no_test_string_const"]; // val: no_test_string_constoptional string Email = 2 [default = "email"]; // val: emailoptional string Sex = 3 [default = "sex"]; // val: sexoptional string Address = 4 [default = "address"]; // val address}
}

2、生成pb.go文件(文件名后缀由生成语言决定,此处以go为例)
指令不在此赘述。
生成的文件关键信息如下(注意中文注释部分):

type Constant_TestStringConst struct {NO_TEST_STRING_CONST *string `protobuf:"bytes,1,opt,name=NO_TEST_STRING_CONST,json=NOTESTSTRINGCONST,def=no_test_string_const" json:"NO_TEST_STRING_CONST"`Email                *string `protobuf:"bytes,2,opt,name=Email,def=email" json:"Email"`Sex                  *string `protobuf:"bytes,3,opt,name=Sex,def=sex" json:"Sex"`Address              *string `protobuf:"bytes,4,opt,name=Address,def=address" json:"Address"`XXX_unrecognized     []byte  `json:"-"`
}func (m *Constant_TestStringConst) Reset()         { *m = Constant_TestStringConst{} }
func (m *Constant_TestStringConst) String() string { return proto.CompactTextString(m) }
func (*Constant_TestStringConst) ProtoMessage()    {}
func (*Constant_TestStringConst) Descriptor() ([]byte, []int) {return fileDescriptorSellerCsRouting, []int{0, 2}
}const Default_Constant_TestStringConst_NO_TEST_STRING_CONST string = "no_test_string_const"
const Default_Constant_TestStringConst_Email string = "email"
const Default_Constant_TestStringConst_Sex string = "sex"
const Default_Constant_TestStringConst_Address string = "address"func (m *Constant_TestStringConst) GetNO_TEST_STRING_CONST() string {if m != nil && m.NO_TEST_STRING_CONST != nil {return *m.NO_TEST_STRING_CONST}return Default_Constant_TestStringConst_NO_TEST_STRING_CONST
}func (m *Constant_TestStringConst) GetEmail() string {// 【核心代码】// 如果email字段有值,则返回,但其实一般不会对其做赋值if m != nil && m.Email != nil {return *m.Email}// 一般都走下面这里:返回默认值:"email"// sex、address字段类同,后面不再赘述return Default_Constant_TestStringConst_Email
}func (m *Constant_TestStringConst) GetSex() string {if m != nil && m.Sex != nil {return *m.Sex}return Default_Constant_TestStringConst_Sex
}func (m *Constant_TestStringConst) GetAddress() string {if m != nil && m.Address != nil {return *m.Address}return Default_Constant_TestStringConst_Address
}

3、使用

  v := (&stonelu_learn_pb.Constant_TestStringConst{}).GetEmail()t.Logf("v: %v", v)

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/28763.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Flink CEP(三)pattern动态更新

线上运行的CEP中肯定经常遇到规则变更的情况,如果每次变更时都将任务重启、重新发布是非常不优雅的。尤其在营销或者风控这种对实时性要求比较高的场景,如果规则窗口过长(一两个星期),状态过大,就会导致重启…

【云原生】Docker-Compose全方面学习

目录 1.compose简介 Compose V2 2.compose安装与下载 二进制包 PIP 安装 bash 补全命令 卸载 3.docker compose管理命令 命令对象与格式 命令选项 命令使用说明 1.compose简介 Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可…

Acwing.883 高斯消元解线性方程组

题目 输入一个包含n个方程n个未知数的线性方程组。 方程组中的系数为实数。 求解这个方程组。 下图为一个包含m个方程n个未知数的线性方程组示例: 输入格式 第一行包含整数n。 接下来n行,每行包含n1个实数,表示一个方程的n个系数以及等号右侧的常数。 …

《向量数据库指南》——Rockset 为实时数据库添加向量嵌入支持(一)

同样,Venkataramani——除了是 Rockset 的联合创始人外,还担任首席执行官——表示,增加对向量嵌入的支持的关键方面是供应商现在使用户能够在一个位置管理和探索所有类型的数据。 “一个单一的数据库现在可以存储你的结构化数据、半结构化数据和你的向量嵌入来构建丰富的…

‘vue’不是内部或外部命令,也不是可运行的程序或批处理文件的原因及解决方法

今天我在用node.js的时候,结果出现如下错误: C:\Users\xiesj> vue -v vue不是内部或外部命令,也不是可运行的程序或批处理文件。 原因: 1、确定npm是否已正确安装? 2、确定vue以及vue-cli已正确安装?…

记录线上一次mysql只能查询,不能插入或更新的bug

错误复现 突然有一天产品通知xx服务不可用,想着最近也没有服务更新,就先排查一下服务日志 使用postman测试的时候请求明显超时,查看日志显示是一个锁的问题 使用工具连接到mysql,查看information_schema.INNODB_TRX,发现有一个事…

【C++】做一个飞机空战小游戏(五)——getch()控制两个飞机图标移动(控制光标位置)

[导读]本系列博文内容链接如下: 【C】做一个飞机空战小游戏(一)——使用getch()函数获得键盘码值 【C】做一个飞机空战小游戏(二)——利用getch()函数实现键盘控制单个字符移动【C】做一个飞机空战小游戏(三)——getch()函数控制任意造型飞机图标移动 【C】做一个飞…

二、 MySQL 内部技术架构

二、 MySQL 内部技术架构 047 Mysql内部支持缓存查询吗? 当MySQL接收到客户端的查询SQL之后,仅仅只需要对其进行相应的权限验证之后,就会通过Query Cache来查找结果,甚至都不需要经过Optimizer模块进行执行计划的分析优化&…

杀手锏SwissTable

杀手锏SwissTable 0.导语 最近在研究HashJoin的性能,发现SwissTable的性能真牛逼,对于原生的哈希表采用STL的unordered_multimap,其性能一般,为了加速这个查找,Arrow提供了SwissJoin,其实现原理为SwissTabl…

Java GUI——网页浏览器开发

Java GUI——网页浏览器开发 前言:为了做java课设,学了一手Java GUI。感觉蛮有意思的,写写文章,做个视频记录一下。欢迎大家友善指出我的不足 网页浏览器开发录制视频,从头敲到尾 任务需求 界面需求 菜单栏 文件 【…

接口测试之文件上传

在日常工作中,经常有上传文件功能的测试场景,因此,本文介绍两种主流编写上传文件接口测试脚本的方法。 首先,要知道文件上传的一般原理:客户端根据文件路径读取文件内容,将文件内容转换成二进制文件流的格式…

vue3中使用vue-simple-uploader

vue-simple-uploader本身是基于vue2的,直接npm i vue-simple-uploader -S下载下来版本的是0.7.6。在vue3中无法使用会报错。 解决:使用next安装接下来要发布的版本就会下载1.0.1版本,即可使用vue3 npm i vue-simple-uploadernext -S 注意&…

【linux】ssh 和adb connect区别

问:ssh 与ping的区别 答:SSH(Secure Shell)和Ping是两种完全不同的网络工具。 SSH是一种加密的网络协议,用于安全地远程管理或访问远程计算机。它提供了一种安全的通信方式,可以在不安全的网络上进行远程登…

SpringMVC的架构有什么优势?——视图与模型(二)

前言 「作者主页」:雪碧有白泡泡 「个人网站」:雪碧的个人网站 「推荐专栏」: ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄,vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…

【数据结构】‘双向链表’冲冲冲

💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃个人主页 :阿然成长日记 …

Prometheus技术文档-概念

Prometheus是一个开源的项目连接如下: Prometheus首页、文档和下载 - 服务监控系统 - OSCHINA - 中文开源技术交流社区 基本概念: Prometheus是一个开源的系统监控和告警系统,由Google的BorgMon监控系统发展而来。它主要用于监控和度量各种…

《UNIX 传奇:历史与回忆》读后感

《UNIX 传奇:历史与回忆》 是 bwk(Brian W. Kernighan)2019 年的新作,回忆了 UNIX 在大半个世纪的风雨历程,是一本引人入胜的书籍。通过对 UNIX 操作系统的历史和发展进行详细的叙述和回顾,让我对这个操作系…

微信-公众号服务器配置,小程序token认证

参考微信文档 这部分代码试用于微信公众号的服务器token校验,且适用于小程序的token校验 接入概述 | 微信开放文档 @RequestMapping(value = "/message/verify")public @ResponseBody String verify(HttpServletRequest request, HttpServletResponse respons…

【eNSP】静态路由

【eNSP】静态路由 原理网关路由表 实验根据图片连接模块配置路由器设备R1R2R3R4 配置PC的IP地址、掩码、网关PC1PC2PC3 配置静态路由查看路由表R1R2R3R4测试能否通信 原理 网关 网关与路由器地址相同,一般路由地址为.1或.254。 网关是当电脑发送的数据的目标IP不在…

CSS基础介绍笔记1

官方文档 CSS指的是层叠样式(Cascading Style Sheets)地址:CSS 教程离线文档:放大放小:ctrl鼠标滚动为什么需要css:简化修改HTML元素的样式;将html页面的内容与样式分离提高web开发的工作效率&…