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

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。日期: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"]
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.