Как установить значения по умолчанию в зайдите структуры


существует несколько ответов / методов на следующий вопрос:

  1. Как установить значения по умолчанию для структур golang?
  2. как инициализировать структуры в golang

У меня есть несколько ответов, но требуется дальнейшее обсуждение.

5 69

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
}
  1. заставить метод получить структуру (путь конструктора).

    хороший дизайн, чтобы сделать ваш тип неэкспортируется, но дают экспортировать конструктор функции, как NewMyType (), в котором вы можете правильно инициализируйте свою структуру / тип. Также возвращает тип интерфейса, а не a конкретный тип, и интерфейс должен содержать все, что другие хотят к вашей стоимости. И ваш конкретный тип должен реализовать это интерфейс курс.

    Это может быть сделано, просто сам тип неэкспортируется. Вы можете экспортировать функцию NewSomething и даже поля Text и DefaultText, но просто не экспортируйте структуру типа something

  2. другой способ настроить его для вашего собственного модуля-это использовать 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
}
type Config struct {
    AWSRegion                               string `default:"us-west-2"`
}