2012-11-06 79 views
23

在圍棋,有下面的代碼兩段之間有明顯的差異:新()和「常規」分配有區別嗎?

v := &Vector{} 

,而不是

v := new(Vector) 
+0

的可能重複[進入:?我爲什麼會做()或新的()](http://stackoverflow.com/questions/9320862/go-why-would-i-make - 或 - 新) –

回答

16

號返回什麼內容是一樣的,

package main 

import "fmt" 
import "reflect" 

type Vector struct { 
    x int 
    y int 
} 

func main() { 
    v := &Vector{} 
    x := new(Vector) 
    fmt.Println(reflect.TypeOf(v)) 
    fmt.Println(reflect.TypeOf(x)) 
} 

結果:

*main.Vector 
*main.Vector 

有郵件列表上的一些論點,即同時具有令人困惑:

https://groups.google.com/forum/?fromgroups=#!topic/golang-nuts/GDXFDJgKKSs

有一點需要注意:

新的()是獲得一個指向 的唯一途徑未命名的整數或其他基本類型。你可以寫「p:= new(int)」,但是你不能寫「p:= & int {0}」。除此之外,這是一個 的優先事項。

來源:https://groups.google.com/d/msg/golang-nuts/793ZF_yeqbk/-zyUAPT-e4IJ

+0

我想他們可以支持'p:=&0',如果他們想保持關鍵字倒數。 –

0

在本例中這兩個值將在堆上分配。 Go不像C,你可以明確地確定內存分配的位置。 Go在編譯時執行「逃逸分析」,並在必要時在堆上分配內存。據我所知,如果你曾經參考過一個對象的地址,它將被分配到堆上。由於v := &Vector{}正在將Vector{}的地址分配給v,因此編譯器將決定將此需求分配到堆上。

3

根據Effective Gonew()是分配內存並將其清零的函數;即每個字段(以及該結構的整個內存)將被設置爲0 s。如果你設計的結構,以便當他們創建時,所有字段應該等於零,比它的罰款,並建議使用它。但是,如果您需要更多地控制要使用的初始值,則應使用更傳統的方法。

在具體的情況下,你提到的差異是無關緊要的,但它應該在別處註明。

我希望這有助於! :)

10

是的,這兩個代碼片段之間存在根本差異。

v := &Vector{} 

作品Vector是一個結構類型,圖型,陣列型或片型

v := new(Vector) 

Works爲的任何類型Vector

例子:http://play.golang.org/p/nAHjL1ZEuu

+0

說'新(地圖)'不是一個好主意,但:http://play.golang.org/p/u89EYchY5n - 地圖,切片和頻道必須由'make()'製作,並且因爲它們是參考無論如何,使用new()來表示它們毫無意義。 –

+0

這不是'new'的問題。實際上'new(anyType)'沒有錯:http://play.golang.org/p/e3hmtK_IV8 – zzzz

+0

你是對的,但它仍然毫無意義,因爲'map'已經是一個指針了,所以make()是正確的使用,而不是'new()'。 –