转载地址:https://studygolang.com/articles/28563

protobuf导出golang,调整默认tag的方法
问题概述
在protobuf导出到golang的时候,生成的.go文件里的struct的tag是没办法灵活设置的,以下面这个message为例test.protosyntax=proto3;
package test;option go_package = ".;test";message MyMessage {int64 Code = 1;
}
执行protoc --proto_path=. --go_out=. test.proto导出的test.pb.go里的MyMessage这个结构体的定义会是这样:type MyMessage struct {state         protoimpl.MessageStatesizeCache     protoimpl.SizeCacheunknownFields protoimpl.UnknownFieldsCode int64 `protobuf:"varint,1,opt,name=Code,proto3" json:"Code,omitempty"`
}
可以看到Code字段的protobuf和json的tag都是固定的(目前还没有找到方法能通过protoc命令的参数来设置tag),但是这样的struct有时候并不是我们所期待的,比如下面的代码片段:msg := &MyMessage{Code: 0}
bdata, _ := json.Marshal(msg)
fmt.Println(string(bdata))
这段代码最终的输出会是{},因为Code的json tag设置了omitempty,这种情况在开发过程中有时候是很蛋疼的,因为即便Code是默认值0,我们也还是希望能打印出来的。因此我们需要一种方法能通过在编写proto文件的时候,在里面注入tag,然后导出成go的时候这个被注入的字段的tag可以自定义。解决方法
protoc-go-inject-tag: https://github.com/favadi/protoc-go-inject-tag
安装:go get https://github.com/favadi/protoc-go-inject-tag
这个库可以再proto文件中注入tag,然后在导出的时候相应的字段的tag就可以被修改掉了。具体做法如下:
test.protosyntax=proto3;
package test;option go_package = ".;test";message MyMessage {// @inject_tag: json:"Code"int64 Code = 1;
}
可以看到与之前不同的是我们在Code这个字段上面加了一行注释// @inject_tag: json:"Code"。
执行protoc --proto_path=. --go_out=. test.proto
protoprotoc-go-inject-tag -input=./test.pb.go
这时候导出的test.pb.go文件里的MyMessage结构体如下:type MyMessage struct {state         protoimpl.MessageStatesizeCache     protoimpl.SizeCacheunknownFields protoimpl.UnknownFields// @inject_tag: json:"Code"Code int64 `protobuf:"varint,1,opt,name=Code,proto3" json:"Code"`
}
可以看到Code字段的json tag里的omitempty没有了,这时候如果我们再执行msg := &MyMessage{Code: 0}
bdata, _ := json.Marshal(msg)
fmt.Println(string(bdata))
这个代码片段,输出就是{"Code": 0}了。达到我们的目的了。当然inject_tag不仅仅可以设置json的tag,它可以设置任何的tag。总结
protobuf的protoc工具导出golang的时候,导出的结构体的tag是固定死的,在实际的使用中会导致很多不方便或是不灵活,通过protoprotoc-go-inject-tag这个工具,可以inject tag,这样就能灵活的调整导出的pb.go文件里的结构体的tag。

protobuf导出golang,调整默认tag的方法相关推荐

  1. Origin 2017 调整默认字体的方法

    我们毕业设计论文要求图片中的汉字用宋体,数字和字母用新罗马体(Times New Romano),如果每张图表都要挨个改会非常麻烦,而且也会出一些bug,所以还是直接设置默认字体比较方便,小编在这里以 ...

  2. plotplay恢复默认设置_PotPlayer如何调整常用设置?PotPlayer调整常用设置的方法步骤...

    PotPlayer如何调整常用设置?最近有很多小伙伴想要知道PotPlayer如何调整常用设置才能让播放效果更佳,那么今天小编就给大家带来PotPlayer调整常用设置的方法步骤吧. 方法/步骤 1. ...

  3. 关于PHPExcel导出Excel时身份证,数字会导出为科学计数的处理方法

    原文:关于PHPExcel导出Excel时身份证,数字会导出为科学计数的处理方法 上次在开发一个项目时,用到PHPExcel导出数据,其中有导出身份证等长串数字时导出的Excel中显示为科学计数方式. ...

  4. matlab怎么调整子图间距,matplotlib调整子图间距,调整整体空白的方法

    matplotlib调整子图间距,调整整体空白的方法 如下所示: fig.tight_layout()#调整整体空白 plt.subplots_adjust(wspace =0, hspace =0) ...

  5. 计算机快捷键 还原默认值,CAD默认快捷键如何恢复?教你还原CAD默认配置的方法...

    小编告诉大家AutoCAD的操作命令和各种设置分为默认和自定义. 可以根据每个人的喜好进行设置. 不必完全遵循该软件的默认操作,只是因为此快捷键是可变的,所以我仍然不习惯更改我的个人操作,并且想要恢复 ...

  6. 区分 Protobuf 中缺失值和默认值

    转载地址:区分 Protobuf 中缺失值和默认值 - 知乎 Protobuf 是目前非常主流的二进制序列化格式,GRPC 默认使用 Protobuf v3 格式,下面是 Protobuf 消息定义的 ...

  7. DataGridView导出到Excel的三个方法

    DataGridView导出到Excel的三个方法 原文:[转]DataGridView导出到Excel的三个方法 原文出处:http://www.yongfa365.com/Item/DataGri ...

  8. 2017cad光标大小怎么调_AutoCAD 2010如何调整光标的大小?调整光标大小的方法

    AutoCAD 2010如何调整光标的大小?小伙伴们是不是很想知道该怎么做呢?下面感兴趣的小伙伴就和小编一起来学习一下调整光标大小的方法吧! 打cad,好郁闷的看到光标这么小,看起来不舒服,如图 我们 ...

  9. 古剑奇谭如何修改服务器,《古剑奇谭3》设置游戏默认存档服务器方法

    <古剑奇谭3>设置游戏默认存档服务器方法,怎么修改游戏启动选项.由于本作采用在线存档机制,玩家启动游戏将会选择东亚或者北美服务器作为存档同步服务器.然而默认桌面快捷方式或Steam图标右键 ...

最新文章

  1. 使用Prism提供的类实现WPF MVVM点餐Demo
  2. 如何网络推广分析新站上线后网站不收录的原因有哪些?
  3. java mina 长连接_apache mina 长连接
  4. python创建矩阵_Python创建对称矩阵的方法示例【基于numpy模块】
  5. div中内部div横向布局
  6. java String.intern();
  7. 开源GIS(十七)——OGC标准
  8. Hotel 旅馆 题解(From luoguBlog)
  9. 预应力钢筒混凝土管(PCCP)行业发展现状及竞争格局分析报告2022-2027年版
  10. 逻辑回归原理与sklearn实现
  11. iOS小技能:地址选择器(支持省份,省市,省市区,支持显示上一次选择的地址)
  12. 获取IP地址信息的API合集
  13. Gulp——JS模块化说明视频-张晓飞-专题视频课程
  14. spring源码分析之BeanDefinition相关
  15. C语言电话号码判断合法性
  16. 如何tradeoff
  17. 零基础可以学习厚涂么?
  18. 分享一个 Python + Django 实现的电商小项目
  19. 用计算机如何换成音乐,电脑开机与关机音乐如何替换成自己喜欢的音乐
  20. c++ 向量化_利用量子纠缠,向真空借能量

热门文章

  1. Apache Kafka 2.7.0 稳定版发布
  2. Springboot Vue Login(从零开始实现Springboot+Vue登录)
  3. 一道关于String的易错习题
  4. Linux块层技术全面剖析-v0.1
  5. (21)Spring Boot过滤器、监听器【从零开始学Spring Boot】
  6. kali实战-被动信息收集
  7. “Could not change executable permissions on the application”的原因和解决方法
  8. 在Excel工作表区域内快速移动或滚动
  9. [C++]Qt 如何处理密集型耗时的事情(频繁调用QApplication::processEvents)
  10. 从汇编角度看待函数调用