2015-07-21 77 views
2

如何为结构创建对象?应该用什么New()或var in go?

object := new(struct) 

var object struct 

我不能understatnd时使用什么?如果两者都相同,哪一个应该是首选?

+1

可能重复[何时应该在Go中使用'new'](http://stackoverflow.com/questions/3129068/when-should-new-be-used-in-go) –

回答

4

当你需要一个指针对象时,使用新的或复合的文字,否则使用var。

尽可能地使用var,因为这更有可能被分配到栈中,并且一旦范围结束,内存就会被释放。我的新内存情况最可能分配在堆中,需要进行垃圾回收。

+1

我认为你关于heap/stack的评论是误导性的:考虑在一个函数中创建'var x T'并在最后调用'return&x'。另外'new(T)'不一定需要在堆上分配 - 这取决于编译器的逃逸分析该做什么。见:https://golang.org/doc/faq#stack_or_heap – tomasz

+0

你是正确的@tomasz。它编辑答案使其更加清晰。 –

5

您显示的new语法返回一个指针,而另一个是一个值。看看这里的这篇文章; https://golang.org/doc/effective_go.html#allocation_new

实际上甚至还有一个我更喜欢的选项。它被称为复合文字,看起来像这样;

object := &struct{} 

以上示例等同于您使用new。关于它的很酷的事情是你可以在那里为方括号内的struct指定任何属性的值。

何时使用什么是您需要根据具体情况做出的决定。在Go中有几个理由我想要一个或另一个;也许只有指针*myType实现了一些接口,而myType没有,一个实例myType可能包含大约1 GB的数据,并且您希望确保您传递的是指针而不是其他方法的值等。要使用哪个选项取决于用例。虽然我会说,指针很少会更糟,因为我几乎总是使用它们。