Каков наилучший способ реализации методов конструктора / инициализации в Go? - PullRequest
0 голосов
/ 12 мая 2018

У меня есть программа, как показано ниже:

package main

//Define declare variables
type Define struct {
    len    int
    breath int
}

//Area calculate area
func (e *Define) Area() (a int) {
    a = e.len * e.breath
    return a
}

Я вызываю вышеуказанную программу в:

package main

func main() {
    y := Define{10, 10}
    x := y.Area()
    print(x)
}

Я хотел бы сделать функцию Area () как часть инициализации структуры. В настоящее время я должен создать новый объект для «Определить», то есть «у», а затем вызвать метод Area. Вместо этого есть способ, которым методы области автоматически вычисляют, когда я создаю объект?

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Go имеет концепцию «Конструкторы» , которая может охватывать ваш вариант использования. В сочетании с экспортом это позволяет инкапсулировать инициализацию, скрывая специфику расчета от абонентов:

package main

//Define declare variables
type Define struct {
    len    int
    breath int
    area   int 
}

func (e Define) Area() int {
    return e.area
}

func NewDefine(l, b int) Define {
   d := Define{
      len: l,
      breath: b,
      area: calculateArea(l, b),
   }
   return d
}

Шаблон для фокусировки - это экспортированный NewX. Очень часто встречаются конструкторы с именем NewX, которые инициализируют и возвращают структуру. Вышеуказанные делегаты неэкспортированной функции calculateArea. Конечно, есть много разных способов структурирования вашей программы. calculateArea все еще инкапсулирует вычисление площади для тривиального модульного тестирования, в то же время скрывая его от вызывающих, не экспортируя его.

0 голосов
/ 13 мая 2018

Я бы переименовал Define во что-то лучшее, например Geometry. Обычно в Golang New ... используется как "конструктор"

Поскольку вы сказали, что хотите, чтобы область была автоматически рассчитана, включите эту область в качестве поля структуры. Вот как я бы это сделал (https://play.golang.org/p/4y6UVTTT34Z):

package main

//variables
type Geometry struct {
    len    int
    breath int
    area   int
}

// Constructor
func NewGeometry(len int, breadth int) *Geometry {
    g := &Geometry{len, breadth, Area(len, breadth)}
    return g
}

//Area calculate area
func Area(len, breadth int) (a int) {
    return len * breadth
}

func main() {
    g := NewGeometry(10, 2)
    fmt.Println(g.area)
}
...