Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/100.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Go中实现构造函数/init方法的最佳方法是什么_Go_Constructor_Init - Fatal编程技术网

在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
初始化一个新实例。