這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。日期:2014年7月22日
一、array[數組]
1、定義:array 由 [n]<type> 定義,n 標示 array 的長度,而 <type> 標示希望儲存的內容的類型。 例如: var arr[10] int arr[0] = 1 arr[1] = 2 數組實值型別的:將一個數組賦值給 另一個數組,會複製所有的元素。另外,當向函數內傳遞一個數組的時候,它將獲得一個數組的副本,而不是數組的指標。
2、數組的複合聲明。a :=[3]int{1,2,3}或簡寫為a:=[...]int{1,2,3}(Go會自動統計元素個數)
3、多維陣列 例如:a := [2][2]int{ [2]int{1,2}, [2]int{3,4} } 等價於a := [2][2]int{ [...]int{1,2}, [...]int{3,4} } 在2010-10-27發布版中,當聲明的數組的元素類型都一致,那麼可以省略內部元素的類型。上面的聲明方式可以改寫為a := [2][2]int{ {1,2}, {3,4} }
4、數組長度也是類型的一部分,因此具有不同長度的數組,其類型是不同的。 二、slice[切片]
1、slice 與 array 接近,但是在新的元素加入的時候可以增加長度。slice 總是指向底層的一個 array。slice本身不是數組,slice 是一個指向 array的指標,這是其與 array 不同的地方;slice 是參考型別, 這意味著當賦值某個 slice 到另外一個變數,兩個引用會指向同一個 array。
2、建立一個slice:sl := make([]<type>,len,cap),cap值可以省略(省略時,值等同於len),len表示存放元素的個數,cap表示容量。容量的大小cap =< real_cap < 2 * cap,當大小超過容量cap時,會容量會自動升級,但是必須說明的是,自動升級後,將會重新分配連續的記憶體位址。
3、一個slice可以通過a[i:j]的方式建立,建立的slice將會指向a,從i開始,到(j-1)結束,長度=j-i。
4、slice的append操作。slice可以在尾部追加元素,甚至還可以將一個slice追加到另一個slice的尾部,如果最終的長度沒有超過原始的slice,那麼append操作將返回原來的slice,否則將重新分配記憶體位址。
5、slice的copy操作。copy操作返回複製的元素的個數,複製的數量是len(src)和len(dst)中最小的值。
6、slice操作的一些樣本
a := [6] int {1,2,3,4,5,6} //數組下標從0開始 s1 := a[0:4] //1,2,3,4 s2 := a[:] //1,2,3,4,5,6,是a[0:len(a)]的簡寫 s3 := a[:3] //1,2,3,是a[0:3]的簡寫 //s4 := a[1:7] //數組越界,拋出invalid slice index 7 (out of bounds for 6-element array) s5 := s2[:] //1,2,3,4,5,6,此時的s5和s2依然指向a,可通過內建函數println(slice)列印出結果對比。
s6 := [] int {1} s7 := append(s6,2) s8 := append(s7,2,2,3,3) //s9 := append(s7,s6...) //注意這後面有三個點,不加上的話會報類型錯誤。我開始還以為是省略符號,糾結了半天。
var ar = [...] int {1,2,3,5,6,7} n1 := copy(s10,ar[0:]) //返回結果 n1=6,此時 s10的值為[1 2 3 5 6 7] n2 := copy(s10,s10[2:]) //返回結果 n2=4,此時 s10的值為[3 5 6 7 6 7]
關於slice容量擴容重新分配記憶體位址的問題也沒有完全弄明白,以後再補充進來吧。
三、map[字典]
1、map在Go語言中是作為一種內建類型存在。一般定義map的方法為:map[<from type>]<to type>例如:sexes := map[string]string{ "Man":"男", "Male":"女",//後面的逗號必須要寫 }2、聲明map:mapName := make(map[type1]type2){}
3、map索引取值,mapName["key"],例如:sexes["Male"]
4、遍曆map,可以使用range,例如: for _,sex := range sexes { fmt.Println(sex) }
5、向map中增加元素:mapName["newKey"]=value,例如:sexes["unknow"] = "未知性別"//向map增加元素
6、刪除map的元素:delete(mapName,"key"),例如:delete(sexes,"unknow")//刪除map中的元素,會刪除map中由m[x]建立的執行個體
7、檢查map中是否存在某元素例如: var val string var present bool val,present = sexes["nothing"]
也可以直接使用“逗號ok”的形式,例如:v,ok := sexes["Male"]