這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
go語言中定義變數使用關鍵字var,如:var x int=4
也可以寫成x:=4;
在函數中,:=
簡潔指派陳述式在明確類型的地方,可以用於替代 var
定義。
(:=
結構不能使用在函數外,函數外的每個文法塊都必須以關鍵字開始。)
package mainimport ( "fmt")func main() { var x int = 4 fmt.Println(x)//輸出4 fmt.Println(&x)//輸出指標 //fmt.Println(*x) //錯誤 y := 4 fmt.Println(y)//輸出4 fmt.Println(&y)//輸出指標 //fmt.Println(*y) //錯誤 var v *int = new(int)//傳回值為指標 fmt.Println(*v)//輸出為0,它只是將記憶體清零,而不是初始化記憶體*v = 4//賦值 fmt.Println(v)//輸出指標 fmt.Println(*v)//輸出4 z := new(int)//代替var v *int = new(int) *z = 3 fmt.Println(z)//輸出指標 fmt.Println(*z)//輸出3}
總結go語言的變數定義傳回值中隱含了指標,可以進行取指標操作,不嫩進行取值操作。
new和make的區別(轉)
記憶體配置
new 是一個分配記憶體的內建函數,但不同於其他語言中同名的new所作的工作,它只是將記憶體清零,而不是初始化記憶體。new(T)為一個類型為T的新項目分配了值為零的儲存空間並返回其地址,也就是一個類型為*T的值。用Go的術語來說,就是它返回了一個指向新分配的類型為T的零值的指標。
make(T,
args)
函數的目的與new(T)
不同。它僅用於建立切片、map和chan(訊息管道),並傳回型別T
(不是*T
)的一個被初始化了的(不是零)執行個體。這種差別的出現是由於這三種類型實質上是對在使用前必須進行初始化的資料結構的引用。例如,切片是一個具有三項內容的描述符,包括指向資料(在一個數組內部)的指標、長度以及容量,在這三項內容被初始化之前,切片值為nil
。對於切片、映射和通道,make
初始化了其內部的資料結構並準備了將要使用的值。如:
下面的代碼分配了一個整型數組,長度為10,容量為100,並返回前10個數組的切片
make([]int, 10, 100)
以下樣本說明了new
和make
的不同。
var p *[]int = new([]int) // 為切片結構分配記憶體;*p == nil;很少使用var v []int = make([]int, 10) // 切片v現在是對一個新的有10個整數的數組的引用 // 不必要地使問題複雜化:var p *[]int = new([]int)fmt.Println(p) //輸出:&[]*p = make([]int, 10, 10)fmt.Println(p) //輸出:&[0 0 0 0 0 0 0 0 0 0]fmt.Println((*p)[2]) //輸出: 0 // 習慣用法:v := make([]int, 10)fmt.Println(v) //輸出:[0 0 0 0 0 0 0 0 0 0]