protoc-gen-go struct xxx скрыта для отображения интерфейса [string] {} - PullRequest
1 голос
/ 14 марта 2019

struct в файле .pb.go , сгенерированном файлом .proto , имеет три дополнительных поля и некоторые другие вещи, например:

enter image description here

При преобразовании этой struct в json , если одно поле пусто, поле не будет отображаться в json. Теперь я знаю, что это можно сделать с помощью jsonpb.Marshaler .

m := jsonpb.Marshaler{EmitDefaults: true}

Теперь я покрываю struct до map [string] interface {} , вставьте его в InfluxDB . Мне нужно преобразовать struct в map [string] interface {}. Нужна функция NewPoint . как это: enter image description here enter image description here

enter image description here

Я использую structs.Map (значение) Функция Go, Преобразованная карта имеет три дополнительных поля, и запуск программы вызывает ошибки ,, например:

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

Когда я удаляю эти три поля, программа запускается ОК. Эти три поля генерируются автоматически, и у меня много структур. Что мне делать? Спасибо!

1 Ответ

0 голосов
/ 22 марта 2019

Генератор 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.

...