Go Linter, который обеспечивает соблюдение полевых меток в (не) маршалированных структуры.
musttag проверяет, что экспортируемые поля структуры переданы в функцию, подобную Marshal , аннотируются с соответствующей тегом:
// BAD:
var user struct {
Name string
}
data , err := json . Marshal ( user )
// GOOD:
var user struct {
Name string `json:"name"`
}
data , err := json . Marshal ( user )Рациональное руководство из стиля Uber:
Сериализованная форма структуры - это контракт между различными системами. Изменения в структуре сериализованной формы, включая имена поля, нарушают этот контракт. Указание имен поля внутри тегов делает контракт явным, и он охраняет против случайного нарушения контракта путем рефакторинга или переименования полей.
Следующие пакеты поддерживаются из коробки:
Кроме того, любой пользовательский пакет может быть добавлен в список.
musttag интегрирован в golangci-lint , и это рекомендуемый способ его использовать.
Чтобы включить Linter, добавьте следующие линии в .golangci.yml :
linters :
enable :
- musttag В качестве альтернативы, вы можете загрузить предварительно построенный двоичный файл со страницы релизов, чтобы использовать musttag Sandalone.
Запустите golangci-lint с включенным musttag . См. Список доступных параметров для настройки Linter.
При использовании musttag автономный, передайте варианты в качестве флагов.
Чтобы сообщить о пользовательской функции, вам необходимо добавить его описание в .golangci.yml . Ниже приведен пример добавления поддержки для hclsimple.Decode :
linters-settings :
musttag :
functions :
# The full name of the function, including the package.
- name : github.com/hashicorp/hcl/v2/hclsimple.Decode
# The struct tag whose presence should be ensured.
tag : hcl
# The position of the argument to check.
arg-pos : 2 То же самое можно сделать через флаг -fn=<name:tag:arg-pos> при использовании musttag
musttag -fn= " github.com/hashicorp/hcl/v2/hclsimple.DecodeFile:hcl:2 " ./...