protoc-gen-go结构xxx隐藏到map [string] interface {}

时间:2019-03-14 09:52:51

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

.proto 文件生成的 .pb.go 文件中的结构具有三个附加字段和一些其他内容,例如:

enter image description here

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

m := jsonpb.Marshaler{EmitDefaults: true}

现在,我将结构覆盖到 map [string] interface {} ,放入   InfluxDB 。我必须将结构转换为map [string] interface {}。函数 NewPoint 需要。像这样: enter image description here enter image description here

enter image description here

我在go中使用了 structs.Map(value)函数,转换后的地图具有三个附加字段,运行程序会导致错误,如下所示:

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

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

1 个答案:

答案 0 :(得分:0)

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