我第一次和Go一起玩。考虑这个例子。
type Foo struct {
Id int
}
func createFoo(id int) Foo {
return Foo{id}
}
这对小物件来说非常好,但如何为大物体创建工厂功能?
在这种情况下,最好返回指针以避免复制大块数据。
// now Foo has a lot of fields
func createFoo(id int /* other data here */) *Foo {
x := doSomeCalc()
return &Foo{
Id: id
//X: x and other data
}
}
或
func createFoo(id int /* other data here */) *Foo {
x := doSomeCalc()
f := new(Foo)
f.Id = id
//f.X = x and other data
return f
}
这两者有什么区别?这样做的规范方法是什么?
答案 0 :(得分:5)
约定是编写NewFoo
函数来创建和初始化对象。示例:
如果您愿意,可以随时返回指针,因为在访问方法或属性时没有语法差异。我甚至会说,返回指针通常更方便,以便您可以直接在返回的对象上使用指针接收器方法。想象一下像这样的基地:
type Foo struct{}
func (f *Foo) M1() {}
返回对象时,您无法执行此操作,因为返回的值不可寻址(example on play):
NewFoo().M1()
返回指针时,可以执行此操作。 (example on play)
答案 1 :(得分:3)
没有区别。有时一个版本是"自然版本"有时是另一个版本。大多数地鼠会优先考虑第一种变体(除非第二种变体有一些优点)。
(Nitpick:Foo{id}
是不好的做法。请改用Foo{Id: id}
。)