1. 程式人生 > >Go基礎程式設計:複合型別—陣列

Go基礎程式設計:複合型別—陣列

概述

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