登录
首页 >  Golang >  Go问答

将 protoc-gen-go 生成的结构体转换为 map[interface{}]{}

来源:stackoverflow

时间:2024-03-06 17:45:24 201浏览 收藏

大家好,今天本人给大家带来文章《将 protoc-gen-go 生成的结构体转换为 map[interface{}]{}》,文中内容主要涉及到,如果你对Golang方面的知识点感兴趣,那就请各位朋友继续看下去吧~希望能真正帮到你们,谢谢!

问题内容

.proto 文件生成的 .pb.go 文件中的 struct 具有三个附加字段和一些其他内容。如下所示:

将此struct转换为json时,如果有一个字段为空,则该字段不会出现在json中。现在我知道可以使用 jsonpb.marshaler 来完成。

m := jsonpb.marshaler{emitdefaults: true}

现在,我将 struct 转换为 ma​​p[string]interface{},将其放入 influxdb。我必须将 struct 转换为 map[string]interface{}。函数 newpoint 需要。像这样:

我在go中使用了structs.map(value)函数,转换后的map多了三个字段,运行程序会报错,如下:

{"error":"unable to parse 'txt,severity=1 CurrentValue=\"1002\",MetricAlias=\"CPU\",XXX_sizecache=0i,XXX_unrecognized= 1552551101': missing field value"}

当我删除这三个字段时,程序运行正常。这三个字段是自动生成的,而且我有很多结构体。 我该怎么办?谢谢!


解决方案


Protobuf 生成器添加了一些名称以 XXX 开头的附加字段,用于优化。您无法更改 protoc-gen-go 的此行为。

问题在于将 struct 转换为 map[sting]interface{} 的方式。很难弄清楚 structs.Map 到底来自哪个包。似乎是从这里开始的:https://github.com/fatih/structs/blob/master/structs.go#L89 - 此代码使用 reflect 迭代结构的所有字段并将它们推送到 map[sting]interface{}。您只需编写自己的稍微修改版本的 FillMap 例程,该例程将省略 XXX 字段。

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《将 protoc-gen-go 生成的结构体转换为 map[interface{}]{}》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>