Пустые или не требуемые структурные поля в golang

Я немного новичок в типизированных языках, таких как Go и пытаюсь изучить лучшие способы реализации вещей.

У меня есть две структуры, которые представляют собой модели, которые будут вставлены в базу данных mongodb. Одна структура (Инвестиции) имеет другую структуру (Группу) как одно из своих полей.

type Group struct {
    Base
    Name string 'json:"name" bson"name"'
}

type Investment struct {
    Base
    Symbol string 'json:"symbol" bson:"symbol" binding:"required"'
    Group  Group  'json:"group" bson:"group"'
    Fields bson.M 'json:"fields" bson:"fields"'
}

Проблема, которую я испытываю, заключается в том, что в модели инвестиций группа не требуется. Если нет группы, я думаю, что ее лучше не вставлять в db. Каков наилучший способ обработки модели db, такой как это в Go?

Ответ 1

tl; dr: Использовать ,omitempty, и если вам нужно беспокоиться о разнице между нулевым значением и значением null/not defined, выполните то, что делает API GitHub, и используйте указатель.


И json и bson поддерживают тег ,omitempty. Для json "пустые значения: false, 0, любое значение nil или значение интерфейса, а также любой массив, срез, карта или строка нулевой длины" (json docs). Для bson, ,omitempty означает " ,omitempty только поле, если оно не задано нулевым значением для типа или пустым срезам или картам", а нулевые значения включают пустые строки и указатели nil (bson docs).

Поэтому, если вам действительно нужна структура Group, вы можете поместить *Group вместо, и она не будет сохранена, когда указатель равен нулю. Если для Investment требуется только имя группы, это еще проще: "" поскольку имя группы хранит ключ группы.

bson умолчанию использует более bson имя поля, поэтому вы можете опустить это из тега struct, когда они совпадают. json умолчанию использует имя "Заглавное", поэтому укажите нижнее имя в теге, если вам нужен строчный регистр.

Итак, лучший случай, возможно, вы можете просто использовать:

type Investment struct {
    Base
    Symbol string 'json:"symbol" binding:"required"'
    Group string  'json:"group,omitempty" bson:",omitempty"'
    Fields bson.M 'json:"fields"'
}

Если вы когда-либо запускаете поля, где нулевое значение для типа ("", 0, false и т.д.) Отличается от "не указано", вы можете делать то, что делает API GitHub, и накладывать указатели на ваши структуры --essentially расширение трюка *Group.