天天看點

十五、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)
}