概述
數組是指一系列同一類型資料的集合。數組中包含的每個資料被稱為數組元素(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)
}