Есть несколько ответов / методов на следующий вопрос:
- Как установить значения по умолчанию для структур Голанга?
- Как инициализировать структуры в Голанге
У меня есть пара ответов, но требуется дальнейшее обсуждение.
go
struct
initialization
default-value
Prateek
источник
источник
Ответы:
Одна из возможных идей - написать отдельную функцию конструктора.
источник
NewSomething
и даже поляText
иDefaultText
, но только не экспортируйте тип структурыsomething
.reflect.New()
), нельзя ожидать, что она будет знать о вашей специально названной фабричной функции. В этом случае, если не считать самого языка, думаю, подойдет только интерфейс (который может проверять библиотека).Вынудите метод получить структуру (путь конструктора).
Из этого поста :
Это можно сделать, просто сделав сам тип неэкспортированным. Вы можете экспортировать функцию NewSomething и даже поля Text и DefaultText, но просто не экспортируйте что-нибудь типа структуры.
Другой способ настроить его для собственного модуля - использовать структуру Config для установки значений по умолчанию (опция 5 в ссылке). Не очень хороший способ.
источник
Одна из проблем с вариантом 1 в ответе Виктора Заманяна состоит в том, что если тип не экспортируется, то пользователи вашего пакета не могут объявить его как тип для параметров функции и т. Д. Одним из способов решения этой проблемы является экспорт интерфейса вместо структура например
Что позволяет нам объявлять типы параметров функции, используя экспортированный интерфейс кандидата. Единственный недостаток, который я вижу в этом решении, заключается в том, что все наши методы должны быть объявлены в определении интерфейса, но вы можете утверждать, что в любом случае это хорошая практика.
источник
Есть способ сделать это с тегами, который допускает несколько значений по умолчанию.
Предположим, у вас есть следующая структура с 2 тегами по умолчанию default0 и default1 .
Теперь можно установить значения по умолчанию.
Вот полная программа на детской площадке .
Если вас интересует более сложный пример, например, с фрагментами и картами, взгляните на creasty / defaultse
источник
С https://golang.org/doc/effective_go.html#composite_literals :
Иногда нулевое значение недостаточно, и необходим инициализирующий конструктор, как в этом примере, полученном из пакета os.
источник
источник