Использование интерфейсов, как правило, проблематично, поскольку библиотекам, выполняющим демаршалинг, будет трудно решить, какой тип выбрать. Вы можете использовать собственный unmarshaler, в котором вы выбираете подходящий тип, но это более громоздко и сложно.
Проще всего использовать конкретные типы конструкций. Вы должны использовать теги struct для отображения структурных полей и полей в документах MongoDB. Одна важная вещь состоит в том, что в Go поля должны быть экспортированы, иначе они не могут быть заполнены / прочитаны библиотеками, которые выполняют работу. Для его экспорта их имя должно начинаться с заглавной буквы, а подчеркивание (_
) не входит в их число.
Если (под) документы могут иметь разные поля в зависимости от значения, вы можете добавить все, и те, которые присутствуют, будут должным образом не разбиты.
Ваш документ может быть смоделирован так:
type Data struct {
ID string `bson:"_id"`
Structure []Object `bson:"structure"`
}
type Object struct {
T string `bson:"_t"`
Text string `bson:"Text,omitempty"`
State string `bson:"State,omitempty"`
Number string `bson:"Number,omitempty"`
Testing string `bson:"Testing,omitempty"`
}
Обратите внимание, что опция ,omitempty
не требуется для демаршалинга, но если вы хотите использовать эти же типы для марсалирования (например, сохранение нового документа), опция ,omitempty
обеспечит пропуск полей, которые пусты.
Также обратите внимание, что если вас это не устраивает, ничто не мешает вам обработать результат. Вы можете включить доступное поле Object.T
и создать «динамические» экземпляры типов по вашему выбору.