Можете ли вы установить несколько (разных) тегов с одинаковым значением?
Для некоторых моих проектов мне пришлось использовать пакет 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?