十五、Go基礎程式設計:複合型別—陣列
阿新 • • 發佈:2018-10-31
概述
陣列是指一系列同一型別資料的集合。陣列中包含的每個資料被稱為陣列元素(element),一個數組包含的元素個數被稱為陣列的長度。
陣列⻓度必須是常量,且是型別的組成部分。 [2]int 和 [3]int 是不同型別
var n int = 10
var a [n]int //err, non-constant array bound n
var b [10]int //ok
運算元組
陣列的每個元素可以通過索引下標來訪問,索引下標的範圍是從0開始到陣列長度減1的位置。
var a [10]int for i := 0; i < 10; i++ { a[i] = i + 1 fmt.Printf("a[%d] = %d\n", i, a[i]) } //range具有兩個返回值,第一個返回值是元素的陣列下標,第二個返回值是元素的值 for i, v := range a { fmt.Println("a[", i, "]=", v) }
內建函式 len 和 cap 都返回陣列⻓度 (元素數量):
a := [10]int{}
fmt.Println(len(a), cap(a))//10 10
初始化:
a := [3]int{1, 2} // 未初始化元素值為 0 b := [...]int{1, 2, 3} // 通過初始化值確定陣列長度 c := [5]int{2: 100, 4: 200} // 通過索引號初始化元素,未初始化元素值為 0 fmt.Println(a, b, c) //[1 2 0] [1 2 3] [0 0 100 0 200] //支援多維陣列 d := [4][2]int{{10, 11}, {20, 21}, {30, 31}, {40, 41}} e := [...][2]int{{10, 11}, {20, 21}, {30, 31}, {40, 41}} //第二維不能寫"..." f := [4][2]int{1: {20, 21}, 3: {40, 41}} g := [4][2]int{1: {0: 20}, 3: {1: 41}} fmt.Println(d, e, f, g)
相同型別的陣列之間可以使用 == 或 != 進行比較,但不可以使用 < 或 >,也可以相互賦值:
a := [3]int{1, 2, 3}
b := [3]int{1, 2, 3}
c := [3]int{1, 2}
fmt.Println(a == b, b == c) //true false
var d [3]int
d = a
fmt.Println(d) //[1 2 3]
在函式間傳遞陣列
根據記憶體和效能來看,在函式間傳遞陣列是一個開銷很大的操作。在函式之間傳遞變數時,總是以值的方式傳遞的。如果這個變數是一個數組,意味著整個陣列,不管有多長,都會完整複製,並傳遞給函式。
func modify(array [5]int) {
array[0] = 10 // 試圖修改陣列的第一個元素
//In modify(), array values: [10 2 3 4 5]
fmt.Println("In modify(), array values:", array)
}
func main() {
array := [5]int{1, 2, 3, 4, 5} // 定義並初始化一個數組
modify(array) // 傳遞給一個函式,並試圖在函式體內修改這個陣列內容
//In main(), array values: [1 2 3 4 5]
fmt.Println("In main(), array values:", array)
}
陣列指標做函式引數:
func modify(array *[5]int) {
(*array)[0] = 10
//In modify(), array values: [10 2 3 4 5]
fmt.Println("In modify(), array values:", *array)
}
func main() {
array := [5]int{1, 2, 3, 4, 5} // 定義並初始化一個數組
modify(&array) // 陣列指標
//In main(), array values: [10 2 3 4 5]
fmt.Println("In main(), array values:", array)
}