這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
38.蛤蟆筆記go語言——進階
Go有指標,但是沒有指標運算。不能用指標變數遍曆字串的各個位元組。因此它們更象是引用而不是你所知道的來自於C的指標。指標非常有用。
Go同樣也垃圾收集,也就是說無須擔心記憶體配置和回收。
Go有兩個記憶體配置原語,new和make。它們應用於不同的類型,做不同的工作,可能有些迷惑人,但是規則很簡單。
用new分配記憶體
內建函數new本質上說跟其他語言中的同名函數功能一樣:new(T)分配了零值填充的T類型的記憶體空間,並且返回其地址,一個*T類型的值。用Go的術語說,它返回了一個指標,指向新分配的類型的零值。有一點非常重要:new返回指標。
這意味著使用者可以用new 建立一個資料結構的執行個體並且可以直接工作。
用make分配記憶體
回到記憶體配置。內建函數make(T,args)與new(T)有著不同的功能。它只能建立slice,map和channel,並且返回一個有初始值(非零)的T類型,而不是*T。本質來講,導致這三個類型有所不同的原因是指向資料結構的引用在使用前必須被初始化。
make返回初始化後的(非零)值。
務必記得make僅適用於map,slice和channel,並且返回的不是指標。應當用new獲得特定的指標。
new(T)返回*T指向一個零值T
make(T)返回初始化後的T
定義自己的類型
Go允許定義新的類型,通過保留字type實現
type foo int
建立了一個新的類型foo作用跟int一樣。建立更加複雜的類型需要用到struct保留字。這有個在一個資料結構中記錄某人的姓名(string)和年齡(int)
package main
import "fmt"
type NameAge struct {
namestring
age int
}
func main() {
a :=new(NameAge)
a.name= "Pete"
a.age =42
fmt.Printf("%v\n",a)
}
執行:
&{Pete42}
轉換
有時需要將一個類型轉換為另一個類型。在Go中可以做到,不過有一些規則。首先,將一個值轉換為另一個是由操作符(看起來像函數:byte())完成的,並且不是所有的轉換都是允許的。