2015-07-21 39 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的數據,並且您希望確保您傳遞的是指針而不是其他方法的值等。要使用哪個選項取決於用例。雖然我會說,指針很少會更糟,因爲我幾乎總是使用它們。