自定義一個結構體數據結構
type Rect struct {函數
x, y float64指針
width, height float64對象
}內存
初始化方法:開發
rect1 := new(Rect)文檔
rect2 := &Rect{}字符串
rect3 := &Rect{0, 0, 100, 200}string
rect4 := &Rect{width:100, height:200}it
注意這幾個變量所有爲指向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得到特定的指針。