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

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

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

m := jsonpb.Marshaler{EmitDefaults: true}

Теперь я покрываюstruct дляmap [string] interface {},поместив ее вInfluxDB. Я должен преобразовать структуру в map[string]interface{}. ФункцияNewPoint нужна. как это:

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

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

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

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 поля.

Другие вопросы по тегам