在Go语言中创建对象

3
我是第一次尝试使用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
}

这两者有何不同?哪种是规范的方法?

1
这通常是一种观点和风格的问题。没有标准形式。 - peterSO
2个回答

5

按照惯例,编写NewFoo函数来创建和初始化对象。例如:

如果您愿意,您可以始终返回指针,因为在访问方法或属性时没有语法差异。我甚至会说,通常更方便返回指针,这样您就可以直接在返回的对象上使用指针接收器方法。 想象一下这样的基础:

type Foo struct{}
func (f *Foo) M1() {}

当返回对象时,由于返回的值不可寻址(play上的示例),因此您无法这样做:

NewFoo().M1()

当返回一个指针时,您可以这样做。(在play上的示例

3

没有区别。有时一个版本是“自然的”,有时另一个版本是。“第一个变量”更受大多数 Gophers 的欢迎(除非第二个变量有些优点)。

(挑剔的话:Foo{id} 是不好的实践。请改用 Foo{Id: id}。)


2
另一个小问题是,惯用的做法是将这种方法称为“NewFoo”,或者如果您的包名为“foo”,则仅称其为“New”。 - Ainar-G

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接