這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
Arrays:數組
在go語言中數組array是一組特定長度的有序的元素集合,元素類型可以是任意的原始類型例如整形、字串或者自訂類型,通過索引(位置)來讀取(或者修改),索引從0開始,第一個元素索引為 0,第二個索引為 1,以此類推
array.go
package mainimport "fmt"func main() { //這裡我們建立了一個長度為5的數組. 這一組數組的初值是zero-valued。整型就是0 var a [5]int fmt.Println("emp:", a) //可以通過array[index] = value文法賦值 a[4] = 100 fmt.Println("set:", a) fmt.Println("get:", a[4]) //內建的len函數會返回數組長度 fmt.Println("len:", len(a)) //通過這個文法聲明數組的預設初值 b := [5]int{1, 2, 3, 4, 5} fmt.Println("dcl:", b) //數群組類型是一維的,但是你可以通過組合建立多維陣列結構 var twoD [2][3]int for i := 0; i < 2; i++ { for j := 0; j < 3; j++ { twoD[i][j] = i + j } } fmt.Println("2d: ", twoD)}
[root@mail work]# go run array.goemp: [0 0 0 0 0]set: [0 0 0 0 100]get: 100len: 5dcl: [1 2 3 4 5]2d: [[0 1 2] [1 2 3]]
Maps:索引值對
Maps是Go語言中的關聯資料類型(在其它語言中有時會被稱之為雜湊表[hashes]或字典[dicts])
maps.go
package mainimport "fmt"func main() { //使用內建的make來合建一個空的map,make(map[鍵類型]實值型別) m := make(map[string]int) //設定鍵/值對使用經典的 name[key] = val 文法。 m["k1"] = 7 m["k2"] = 13 //列印map會輸出裡面所有的索引值對 fmt.Println("map:", m) //擷取某個鍵的值 v1 := m["k1"] fmt.Println("v1: ", v1) //len函數會擷取map中鍵/值對的個數 fmt.Println("len:", len(m)) //使用內建的delete函數從map中移除鍵/值對 delete(m, "k2") fmt.Println("map:", m) //可選的第二傳回值可以指出map中是否包含此鍵的值。避免空值0或""引起的歧義。 _, prs := m["k2"] fmt.Println("prs:", prs) //你也可以在一行中完成聲明與賦值 n := map[string]int{"foo": 1, "bar": 2} fmt.Println("map:", n)}
[root@mail work]# go run maps.gomap: map[k1:7 k2:13]v1: 7len: 2map: map[k1:7]prs: falsemap: map[foo:1 bar:2]
Slices:切片
Slices是Go語言中的關鍵資料類型,它有比數組(arrays)更強的提供者。
slices.go
package mainimport "fmt"func main() { //跟數組(arrays)不同,slices的類型跟所包含的元素類型一致(不是元素的數量)。使用內建的make命令,構建一個非零的長度的空slice對象。這裡我們建立了一個包含了3個字元的字串 。(初始化為零值zero-valued) s := make([]string, 3) fmt.Println("emp:", s) //我們可以像數組一樣進行設定和讀取操作。 s[0] = "a" s[1] = "b" s[2] = "c" fmt.Println("set:", s) fmt.Println("get:", s[2]) //擷取到的長度就是當時設定的長度。 fmt.Println("len:", len(s)) //相對於這些基本的操作,slices支援一些更加複雜的功能。有一個就是內建的append,可以在現有的slice對象上添加一個或多個值。注意要對返回的append對象重新賦值,以擷取最新的添加了元素的slice對象。 s = append(s, "d") s = append(s, "e", "f") fmt.Println("apd:", s) //Slices也可以被複製。這裡我們將s複製到了c,長度一致。 c := make([]string, len(s)) copy(c, s) fmt.Println("cpy:", c) //Slices支援"slice"操作,文法為slice[low:high](即截取slice中的某段值)。下面這段代碼就會擷取這些字元: s[2], s[3], 和 s[4]。 l := s[2:5] fmt.Println("sl1:", l) //從開始截取到每5個字元(除了值) l = s[:5] fmt.Println("sl2:", l) //從第二個(包括)字元開始截取到最後一個 l = s[2:] fmt.Println("sl3:", l) //我們可以將聲明和賦值放在一行。 t := []string{"g", "h", "i"} fmt.Println("dcl:", t) //Slices可以被組合成多維陣列。裡面一維的slices對象可以不等長,這一點跟多維陣列不太一樣。 twoD := make([][]int, 3) for i := 0; i < 3; i++ { innerLen := i + 1 twoD[i] = make([]int, innerLen) for j := 0; j < innerLen; j++ { twoD[i][j] = i + j } } fmt.Println("2d: ", twoD)}
[root@mail work]# go run slices.goemp: [ ]set: [a b c]get: clen: 3apd: [a b c d e f]cpy: [a b c d e f]sl1: [c d e]sl2: [a b c d e]sl3: [c d e f]dcl: [g h i]2d: [[0] [1 2] [2 3 4]]