Как установить значения по умолчанию в зайдите структуры
существует несколько ответов / методов на следующий вопрос:
- Как установить значения по умолчанию для структур golang?
- как инициализировать структуры в golang
У меня есть несколько ответов, но требуется дальнейшее обсуждение.
5 ответов:
одна из возможных идей-написать отдельную функцию конструктора
//Something is the structure we work with type Something struct { Text string DefaultText string } // NewSomething create new instance of Something func NewSomething(text string) Something { something := Something{} something.Text = text something.DefaultText = "default text" return something }
заставить метод получить структуру (путь конструктора).
хороший дизайн, чтобы сделать ваш тип неэкспортируется, но дают экспортировать конструктор функции, как NewMyType (), в котором вы можете правильно инициализируйте свою структуру / тип. Также возвращает тип интерфейса, а не a конкретный тип, и интерфейс должен содержать все, что другие хотят к вашей стоимости. И ваш конкретный тип должен реализовать это интерфейс курс.
Это может быть сделано, просто сам тип неэкспортируется. Вы можете экспортировать функцию NewSomething и даже поля Text и DefaultText, но просто не экспортируйте структуру типа something
другой способ настроить его для вашего собственного модуля-это использовать Config struct для установки значений по умолчанию (Вариант 5 в ссылке) не очень хороший способ, хотя.
одна проблема с вариантом 1 в ответ Виктор Заманян заключается в том, что если тип не экспортируется, то пользователи вашего пакета не могут объявить его как тип для параметров функции и т. д. Одним из способов обойти это было бы экспортировать интерфейс вместо структуры, например
package candidate // Exporting interface instead of struct type Candidate interface {} // Struct is not exported type candidate struct { Name string Votes unit32 // Defaults to 0 } // We are forced to call the constructor to get an instance of candidate func New(name string) Candidate { return candidate{name, 0} // enforce the default value here }
что позволяет нам объявлять типы параметров функции с помощью экспортированного интерфейса кандидата. Единственный недостаток я вижу из этого решения в том, что все наши методы должны быть объявлены в интерфейсе определение, но вы можете утверждать, что это хорошая практика в любом случае.
от https://golang.org/doc/effective_go.html#composite_literals:
иногда нулевое значение недостаточно хорошо, и необходим конструктор инициализации, как в этом примере, полученном из пакета os.
func NewFile(fd int, name string) *File { if fd < 0 { return nil } f := new(File) f.fd = fd f.name = name f.dirinfo = nil f.nepipe = 0 return f }