在Go中实现构造函数/init方法的最佳方法是什么
我有一个计划如下:在Go中实现构造函数/init方法的最佳方法是什么,go,constructor,init,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 := D
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()作为结构初始化的一部分。目前,我必须为“定义”ie“y”创建一个新对象,然后调用方法区域。有没有一种方法可以在创建对象后自动计算面积 我会将Define重命名为更好的名称,比如几何体。通常在戈朗,纽约。。。用作“构造函数” 由于您说过希望自动计算面积,所以请将面积作为结构字段包括在内。以下是我的做法():
我会将Define重命名为更好的名称,比如几何。通常在戈朗,纽约。。。用作“构造函数” 由于您说过希望自动计算面积,所以请将面积作为结构字段包括在内。以下是我的做法(): 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
仍然为琐碎的单元测试封装了面积计算,同时通过不导出它来隐藏它,以防调用方看到。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
仍然为琐碎的单元测试封装了面积计算,同时通过不导出它来隐藏它,使调用方看不到它。名称Define
对于您的结构来说有点奇怪?我不明白,如果它不改变结构的状态,为什么在初始化之后需要调用area()
。如果构造函数的全部要点是返回一个构造的Define
,它的状态会被一些比初始参数更琐碎的东西改变,那么为什么在构造函数中需要这个呢?正如jacob所指出的,你的例子几乎没有意义,也就是说,惯例是定义一个“构造函数”以NewXxx
开头的func,例如NewDefine
或NewArea
,如果包名与要构造的类型匹配,则可以只使用New
。例如,假设您的包名为area
,那么您将定义一个名为New
的func,然后导入area
包的其他包将使用area.New
初始化一个新实例。名称define
对于您的结构来说有点奇怪?我不明白为什么需要调用area()
初始化后,如果不更改结构的状态。如果构造函数的全部要点是返回一个构造的Define
,它的状态会被一些比初始参数更琐碎的东西改变,那么为什么在构造函数中需要这个呢?正如jacob所指出的,你的例子几乎没有意义,也就是说,惯例是定义一个“构造函数”以NewXxx
开头的func,例如NewDefine
或NewArea
,如果包名与要构造的类型匹配,则可以只使用New
。例如,假设您的包名为area
,那么您将定义一个名为New
的func,然后导入area
包的其他包将使用area.New
初始化一个新实例。