在Go中创建对象

时间:2014-07-28 11:00:21

标签: go

我第一次和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
}

这两者有什么区别?这样做的规范方法是什么?

2 个答案:

答案 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}。)