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.hqwc.cn/news/58861.html

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

相关文章

论文浅尝 | 面向多步推理任务专业化较小语言模型

笔记整理:张沈昱,东南大学硕士,研究方向为自然语言处理 链接:https://github.com/FranxYao/FlanT5-CoT-Specialization 动机 本文的动机是探索如何在多步推理任务中通过大型语言模型提升较小的语言模型的性能。作者认为&#xff0…

AVS3:跨多通道预测PMC

前面的文章中介绍了TSCPM,它是AVS3中用于intra模式的跨通道预测技术,它利用线性模型根据亮度重建像素预测色度像素, 跨通道预测技术用于去除不同通道间的冗余信息,TSCPM可以去除Y-Cb、Y-Cr通道间的冗余,然而却忽略了…

什么是训练数据?

算法从数据中学习。算法从得到的训练数据中找到关系,形成理解,做出决策,并评估信心。训练数据越好,模型的表现就越好。 实际上,与算法本身一样,训练数据的质量和数量与数据项目的成功有很大关系。 现在&…

LeetCode150道面试经典题-删除有序数组中的重复项(简单)

1.题目 给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考虑 nums 的唯一元素的数量为 k &#xff0c…

RocketMQ 主备自动切换模式部署

目录 主备自动切换模式部署 Controller 部署​ Controller 嵌入 NameServer 部署​ Controller 独立部署​ Broker 部署​ 兼容性​ 升级注意事项​ 主备自动切换模式部署 该文档主要介绍如何部署支持自动主从切换的 RocketMQ 集群,其架构如上图所示&#xff…

libmpv使用滤镜处理视频进行播放

一、前言 作为一个功能强大的多媒体框架,libmpv为开发者提供了广泛的功能和灵活的控制权。滤镜是libmpv的一个重要特性,允许开发者对视频进行各种实时处理和增强,从而满足用户对于个性化、创意化和高质量视频体验的需求。 滤镜是一种在视频渲染过程中应用特定效果的技术。…

【计算机网络】TCP协议超详细讲解

文章目录 1. TCP简介2. TCP和UDP的区别3. TCP的报文格式4. 确认应答机制5. 超时重传6. 三次握手7. 为什么两次握手不行?8. 四次挥手9. 滑动窗口10. 流量控制11. 拥塞控制12. 延时应答13. 捎带应答14. 面向字节流15. TCP的连接异常处理 1. TCP简介 TCP协议广泛应用于可靠性要求…

记录一次electron打包提示文件找不到的解决方法

没有配置files选项 files的作用是配置打包到应用程序的构建资源 就是说如果你想使用项目那个目录下的文件 就得通过files配置一下不然就会报错 json文件或者yml文件会报的错 格式是这样的 "files": ["dist-electron", "dist"],electron打包配…

解析隧道代理被封的几个主要原因

Hey,各位爬虫高手,你是不是经常遇到爬虫代理HTTP被封的问题?不要慌,今天我来分享一些信息,帮你解析这个问题!告别封禁,让你的爬虫工作更顺利,赶快跟随我一起了解吧! 在爬…

auto-changelog的简单使用

auto-changelog的简单使用 自动化生成Git提交记录,CHANGELOG.md文件 github:https://github.com/cookpete/auto-changelog 安装 npm install -g auto-changelog配置脚本 package.json文件下 "scripts": {"changelog": "aut…

RabbitMQ - 简单案例

目录 0.引用 1.Hello world 2.轮训分发消息 2.1 抽取工具类 2.2 启动两个工作线程接受消息 2.4 结果展示 3.消息应答 3.1 自动应答 3.2 手动消息应答的方法 3.3 消息自动重新入队 3.4 消息手动应答代码 4.RabbitMQ 持久化 4.1 队列如何实现持久化 4.2 消息实现持久化 5.不…

培训报名小程序报名确认开发

目录 1 创建页面2 创建URL参数3 信息展示4 消息订阅5 页面传参6 程序预览总结 我们上一篇介绍了报名功能的开发,在用户报名成功后需要展示报名的确认信息,如果信息无误提示用户支付,在支付之前需要让用户进行授权,允许小程序给用户…