【问题标题】:protoc-gen-go struct xxx covert to map[string]interface{}protoc-gen-go struct xxx 隐蔽到 map[string]interface{}
【发布时间】:2019-03-14 09:52:50
【问题描述】:

.proto文件生成的.pb.go文件中的struct多了三个字段和一些其他的东西。像这样:

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

m := jsonpb.Marshaler{EmitDefaults: true}

现在,我将 struct 转换为 ma​​p[string]interface{},放入 涌入数据库。我必须将 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"}

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

【问题讨论】:

    标签: go protocol-buffers grpc protoc grpc-go


    【解决方案1】:

    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 字段。

    【讨论】:

      猜你喜欢
      • 2021-02-25
      • 1970-01-01
      • 1970-01-01
      • 2020-08-05
      • 2021-06-16
      • 2021-08-23
      • 1970-01-01
      • 2015-01-14
      • 2020-01-02
      相关资源
      最近更新 更多