Можете ли вы установить несколько (разных) тегов с одинаковым значением?

Для некоторых моих проектов мне пришлось использовать пакет viper, чтобы использовать конфигурацию. Пакет требует, чтобы вы добавили mapstructure:"fieldname" чтобы правильно определить и настроить поля вашего объекта конфигурации, но мне также пришлось добавить другие теги для других целей, что привело к чему-то похожему на следующее:

type MyStruct struct {
    MyField string `mapstructure:"myField" json:"myField" yaml:"myField"`
}

Как вы видите, для меня это излишне tag:"myField" для каждого моего тега, поэтому мне было интересно, есть ли способ "связать" их и уменьшить многословие, с чем-то вроде этого mapstructure,json,yaml:"myField"

Или это просто невозможно, и вы должны указывать каждый тег отдельно?

1 ответ

Решение

Структурные теги - это произвольные строковые литералы. Данные, хранящиеся в тегах структуры, могут выглядеть так, как вы хотите, но если вы не будете следовать соглашениям, вам придется написать собственную логику синтаксического анализа / обработки. Если вы будете следовать соглашениям, вы можете использовать StructTag.Get() а также StructTag.Lookup() легко получить значения тегов.

Соглашения не поддерживают "объединение" нескольких тегов, поэтому просто запишите их все.

Соглашения, цитируемые reflect.StructTag:

По соглашению строки тегов представляют собой конкатенацию необязательно разделенных пробелами пар "значение". Каждый ключ является непустой строкой, состоящей из неуправляемых символов, кроме пробела (U+0020 ' '), кавычки (U+0022 '"') и двоеточия (U+003A ':'). Каждое значение заключено в кавычки используя символы "+" U + 0022 и буквенный синтаксис строки Go.

См. Связанный вопрос: Как использовать теги в Go?

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