在Go中实现构造函数/ init方法的最佳方法是什么

时间:2018-05-12 20:05:16

标签: go constructor init

我有一个程序如下:

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()作为struct初始化的一部分。目前,我必须为"定义"创建一个新对象。即" y"然后调用方法Area。相反,有一种方法,当我创建对象时,Area方法会自动计算?

2 个答案:

答案 0 :(得分:3)

我将“定义”重命名为更好的几何体。通常在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)
}

答案 1 :(得分:0)

Go具有可能涵盖您的用例的"Constructors"概念。结合导出,它允许您通过隐藏来自调用者的计算细节来封装初始化:

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仍然封装了普通单元测试的区域计算,同时通过不导出它来将其隐藏在调用者之外。