golang中結構體的初始化方法(new方法)
轉自:http://my.oschina.net/ifraincoat/blog/517139
自定義一個結構體
type Rect struct {
x, y float64
width, height float64
}
初始化方法:
rect1 := new(Rect)
rect2 := &Rect{}
rect3 := &Rect{0, 0, 100, 200}
rect4 := &Rect{width:100, height:200}
注意這幾個變數全部為指向Rect結構的指標(指標變數),因為使用了new()函式和&操作符.而如果使用方法
a := Rect{}
則表示這個是一個Rect{}型別.兩者是不一樣的.參考程式碼:
func main() {
rect1 := &Rect{0, 0, 100, 200}
rect1.x = 10
a := Rect{}
a.x = 15
fmt.Printf("%v\n%T\n", a, a)
fmt.Printf("%v\n%T\n", rect1, rect1)
}
執行結果為:
{15 0 0 0}
main.Rect
&{10 0 100 200}
*main.Rect
從結果中可以清楚的看到兩者的不同.
在Go語言中,未進行初始化的變數都會被初始化為該型別的零值,例如bool型別的零值為false, int型別的零值為0, string型別的零值為空字串. 在Go語言中沒有建構函式的概念,物件的建立通常交由一個全域性的建立函式來完成,以NewXXX來命令,表示"建構函式":
func NewRect(x ,y ,width, height float64) {
return &Rect{x, y, width, height}
}
這一切非常自然.開發者也不需要分析在使用了new之後到底背後發生了多少事情.在Go語言中,一切要發生的事情都直接可以看到. 附:
用 new 分配記憶體 內建函式 new 本質上說跟其他語言中的同名函式功能一樣:new(T) 分配了零值填充的 T 型別的記憶體空間,並且返回其地址,一個 *T 型別的值。用 Go 的術語說,它返回了一個指標,指向新分配的型別 T 的零值。記住這點非常重要。 這意味著使用者可以用 new 建立一個數據結構的例項並且可以直接工作。如 bytes.Buffer的文件所述 “Buffer 的零值是一個準備好了的空緩衝。” 類似的,sync.Mutex 也沒有明確的建構函式或 Init 方法。取而代之,sync.Mutex 的零值被定義為非鎖定的互斥量。 零值是非常有用的。例如這樣的型別定義,56 頁的”定義自己的型別” 內容。 ===================
務必記得 make 僅適用於 map,slice 和 channel,並且返回的不是指標。應當用 new獲得特定的指標。