這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。 數組:
定義方式:var arr [n]type,n表示數組的長度,type表示儲存元素的類型。定義好後,可以使用arr[0] = 42,這樣指定下標來進行數組的讀取和賦值。
注意:在go中長度也是類型的一部分,因此[3]int和[5]int是不同類型的。
go中數組不可以改變長度,數組之間的賦值是值的拷貝賦值,即當把一個數組作為一個參數傳人函數的時候,傳入的其實是數組的備份。arr := [10]int{1,2,5:6},da := [2][4]int{[4]int{1,2,3,4}, [4]int{5,6,7,8} },如果內部的元素和外部的一樣,那麼聲明可以簡化,直接忽略內部的類型 ea := [2][4]int{{1,2,3,4},{5,6,7,8}},如果不知道數組的個數,而是按照初始化給定的值,使用 arr := [...]int{1,2,3},用三個"."點號來指定。
slice切片:
slice就是“動態數組”,傳值的時候他也是拷貝賦值,只是他拷貝的是記憶體位址,是傳遞指標的。slice總是指向一個底層的array,slice聲明也像array一樣,只是不需要長度。
聲明:var ys []int,slice可以從一個數組或一個已經存在的slice中再次聲明,slice通過array[i:j]來擷取,其中i為數組的開始位置,j為結束位置,點不包括j,它的長度為j-i,如果不指定i,預設從開頭開始,不指定j,則直到數組的最後一位。注意:slice的引用是記憶體位址,所以當改變其中的元素的值時,其他的所有指向該slice都會改變該值。len()擷取slice的長度,cap()擷取slice的最大容量,slice的容量為提取數組的開始位置到數組結束位置,即:
arr := [10]int{1,2,3,4,5,6,7,8,9,10} s := arr[2:5]
則len(s)為3,而cap(s)為8。append(s, 追加的元素),如果沒有超過slice的cap值,則會返回原來的slice引用,從而影響到引用同一個數組的其他slice,如果超過了cap值,則會建立一個slice,並返回新slice的引用,此種狀態會跟原來的slice脫離參考關聯性。
copy()函數從源slice的src中複製元素到目標dst,並返回複製元素的個數,如:
sl1 := []int{10, 2, 3}
sl2 := make([]int, 10)
copy(sl2[5:8], sl1[:2])
結果為 0,0,0,0,0,10,2,0,0,0,0
map:
定義方式:map[keyType]valueType,要分別聲明鍵和值的類型,如:map[string]int,map的讀取和設定跟slice一樣,通過key進行操作,聲明可以使用 article := map[string]string{"tech":"the google ....", "music":"或是展翅高飛保持憤怒...."},或者先使用make來建立記憶體空間,再用下標的形式來賦值,如
article := make(map[string]string),
article["tech"] = "the google ..."
article["music"] = "誰知道我們該去向何處..."
注意:map是無序的,每次列印出來的map值都會不一樣。
來判斷map是否有相應的下標可以使用:golang, ok := language["go"],通過map[key]可以返回兩個值,一個返回相應下標下的值,一個如果指定的下標在map中不存在返回false,存在返回true。
刪除指定下標的元素,使用 delete(map, "key")。
在go語句中,只有這三種類型是拷貝記憶體位址的,slice,map,channel,其他的都是拷貝賦值,len()函數同樣可以用來擷取map中key的個數。make可以為這三種類型進行記憶體的分配,同時也只能用在這三種類型上,make初始化了內部的資料結構,填充適當的值,返回初始化後的非零值,new可以用於各種類型的記憶體配置,new(TYPE)分配了零值填充的TYPE類型的記憶體空間,並返回其地址。即它返回的是一個記憶體位址*TYPE類型的值(指標)。
”零值“,並非是空值,也不是都是0,對於integers,floats的”零值“為0,對於布爾值的值為false,對於字串”零值“為空白字串。pointers, functions, interfaces, slices, maps, channels的“零值”為nil。不能把“零值”當作布爾false來進行判斷,如:
var a int
if a {
fmt.Println("true")
} else {
fmt.Println("false")
}
這樣是報錯的。