go語言中,提供了多種變量聲明和初始化的方法。這裏着重一一說明。並提供一個簡單的指南。golang
make()
,來初始化slice
,map
和channel
。:=
。var
變量聲明方式。new()
,除非你須要一個指針變量。go語言能夠使用 var
來聲明一個變量,並指明變量的數據類型。指針
// 初始化整數變量,值爲10。 var v int = 10 fmt.Println(v) // 輸出: 10 // 變量聲明: 一個slice變量 var vSlice []int = []int{1, 2, 3, 4} fmt.Println(vSlice, "type: ", reflect.TypeOf(vSlice).Kind()) // 輸出: [1 2 3 4] type: slice // 短變量聲明: 一個map變量,指向的值爲[] var vMap map[string]int = map[string]int{ "a": 1, "b": 2, } fmt.Println(vMap) // 輸出: map[a:1 b:2]
short variable declarations 符號: :=
。code
短變量聲明時,變量的默認類型是: bool
, rune
, int
, float64
, complex128
or string
內存
// 短變量聲明: 一個整數變量。 sdvInt := 10 fmt.Println(sdvInt, "type: ", reflect.TypeOf(sdvInt).Kind()) // 輸出: 10 type: int // 短變量聲明: 一個slice變量 sdvSlice := []int{1, 2, 3, 4} fmt.Println(sdvSlice, "type: ", reflect.TypeOf(sdvSlice).Kind()) // 輸出: [1 2 3 4] type: slice // 短變量聲明: 一個map變量,指向的值爲[] sdvMap := map[string]int{ "a": 1, "b": 2, } fmt.Println(sdvMap) // 輸出: map[a:1 b:2]
new(T)
的特色:源碼
// 初始化一個整數指針變量,指向的值爲0 var i3 *int = new(int) fmt.Println(*i3) // 初始化一個slice指針變量 var i4 = new([10]int)[0:5] fmt.Println(i4, "type: ", reflect.TypeOf(i4).Kind()) // 輸出: [0 0 0 0 0] type: slice // 初始化一個map指針變量,指向的值爲[] var i5 *map[string]int = new(map[string]int) fmt.Println(*i5) // 輸出: map[] // 初始化一個chan指針變量,指向的值爲nil var i6 *chan int = new(chan int) fmt.Println(*i6) // 輸出: nil
make只用於初始化 slice
,map
和 channel
。string
// make只能用於建立slice, map, channel // 切片類型(slice) makeSlice := make([]int, 5, 10) fmt.Println(makeSlice) // 輸出: [0 0 0 0 0] // Map 類型 var makeMap map[string]int = make(map[string]int) fmt.Println(makeMap) // 輸出: map[] // Channel 類型 var makeChan chan int32 = make(chan int32, 100) fmt.Println(makeChan) // 輸出: 0xc000112000
package main import ( "fmt" "reflect" ) func main() { // 初始化整數變量,值爲10。 var v int = 10 fmt.Println(v) // 輸出: 10 // 變量聲明: 一個slice變量 var vSlice []int = []int{1, 2, 3, 4} fmt.Println(vSlice, "type: ", reflect.TypeOf(vSlice).Kind()) // 輸出: [1 2 3 4] type: slice // 短變量聲明: 一個map變量,指向的值爲[] var vMap map[string]int = map[string]int{ "a": 1, "b": 2, } fmt.Println(vMap) // 輸出: map[a:1 b:2] // 短變量聲明: 一個整數變量。 sdvInt := 10 fmt.Println(sdvInt, "type: ", reflect.TypeOf(sdvInt).Kind()) // 輸出: 10 type: int // 短變量聲明: 一個slice變量 sdvSlice := []int{1, 2, 3, 4} fmt.Println(sdvSlice, "type: ", reflect.TypeOf(sdvSlice).Kind()) // 輸出: [1 2 3 4] type: slice // 短變量聲明: 一個map變量,指向的值爲[] sdvMap := map[string]int{ "a": 1, "b": 2, } fmt.Println(sdvMap) // 輸出: map[a:1 b:2] // 初始化一個整數指針變量,指向的值爲0 var newInt *int = new(int) fmt.Println(*newInt) // 初始化一個slice指針變量 var newSlice = new([10]int)[0:5] fmt.Println(newSlice, "type: ", reflect.TypeOf(newSlice).Kind()) // 輸出: [0 0 0 0 0] type: slice // 初始化一個map指針變量,指向的值爲[] var newMap *map[string]int = new(map[string]int) fmt.Println(*newMap) // 輸出: map[] // 初始化一個chan指針變量,指向的值爲nil var newChan *chan int = new(chan int) fmt.Println(*newChan) // 輸出: nil // make只能用於建立slice, map, channel // 切片類型(slice) makeSlice := make([]int, 5, 10) fmt.Println(makeSlice) // 輸出: [0 0 0 0 0] // Map 類型 var makeMap map[string]int = make(map[string]int) fmt.Println(makeMap) // 輸出: map[] // Channel 類型 var makeChan chan int32 = make(chan int32, 100) fmt.Println(makeChan) // 輸出: 0xc000112000 }