這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
Email : hahayacoder@gmail.com
1 Go語言中的指標和C語言中在使用上幾乎沒有什麼差別,熟悉C語言應該很容易掌握,下面是Go語言中使用指標的代碼
package mainimport "fmt"func main() { var value int = 1 //指向int型的指標 var pInt *int = &value //列印相關資訊fmt.Printf("value = %d \n pInt = %d \n *pInt = %d \n", value, pInt, *pInt) //通過指標修改指標指向的值 *pInt = 222fmt.Printf("value = %d \n pInt = %d \n *pInt = %d \n", value, pInt, *pInt) //使指標指向別的地址 var m int = 123 pInt = &m fmt.Printf("value = %d \n pInt = %d \n *pInt = %d \n", value, pInt, *pInt)}
2 Go語言中有兩個分配記憶體的機制,分別是內建的函數new和make。但是new和make並不能等同,他們所做的事情其實並不同,所應用到的類型也不相同,應用情境也不相同,但是在區分在何時使用new和make卻有一個簡單的規則
3 new(T)函數是一個分配記憶體的內建函數,但是不同於其他語言中內建new函數所做的工作,在Go語言中,new只是將記憶體清零,並沒有初始化記憶體。所以在Go語言中,new(T)所做的工作是為T類型分配了值為零的記憶體空間並返回其地址,即返回*T。也就是說,new(T)返回一個指向新分配的類型T的零值指標
即:var pInt *int = new(int) //*pInt = nil
4 make(T, args)函數與new(T)函數的目的不同。make(T, args)僅用於建立切片、map和channel(訊息管道),make(T, args)傳回型別T的一個被初始化了的執行個體。而new(T)返回指向類型T的零值指標。也就是說new函數返回的是*T的未初始化零值指標,而make函數返回的是T的初始化了的執行個體
5 Go語言中出現new和make兩個分配記憶體的函數,並且使用起來還有差異,主要原因是切片、map、channel這三種類型在使用前必須初始化相關的資料結構。例如,切片是一個有三項內容的資料類型,包括指向資料的指標(在一個數組內部進行切片)、長度和容量,在這三項內容被初始化之前,切片值為nil。換句話說:對於切片、map、channel,make(T, args)初始化了其內部的資料結構並為他們準備了將要使用的值
例如:make([]int, 10, 100); //分配一個整形數組,長度為10,容量為100,並返回其前10個數組的切片
6 下面通過一個簡單的例子來說明Go語言中new函數和make函數的差別
package mainimport "fmt"func main() { //使用new為切片分配記憶體 但是返回的是零值指標 //接著還是用使用make初始化 不必要的使問題複雜化 所以幾乎不這樣使用 var p *[]int = new([]int) //*p = nil fmt.Println(p) //輸出&[]fmt.Println(*p) //輸出[] //使用make為切片分配記憶體 在為切片分配記憶體時一般使用這種方法 var v []int = make([]int, 10) fmt.Println(v) //輸出[0 0 0 0 0 0 0 0 0 0 0]}
7 通過上面的例子得出,在為切片、map、channel這三種類型分配記憶體時,為了不必要的使問題複雜化,應該使用Go的內建make函數