Go語言學習筆記(四) [array、slice、map]

日期: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"]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章