go言語トラップの11:配列を関数パラメータとする

725 ワード

これはC/C++の中のよくある問題で、配列が関数パラメータとして値を伝達するか、それとも参照を伝達するか、
コードexample:
package main

import "fmt"

func main() {
    x := [3]int{1, 2, 3}

    func(arr [3]int) {
        arr[0] = 7
        fmt.Println(arr) //prints [7 2 3]
    }(x)

    fmt.Println(x) //prints [1 2 3] (not ok if you need [7 2 3])
}

本意は配列xを更新したいのですが、関数は値を伝達するので、関数体内で、1部のxをコピーしました.そのため、関数体内のデータデータが変化しただけで、データxデータを更新する目的を達成するには、配列ポインタを伝達して、よく知っています.
package main

import "fmt"

func main() {
    x := [3]int{1, 2, 3}

    func(arr *[3]int) {
        (*arr)[0] = 7
        fmt.Println(arr) //prints &[7 2 3]
    }(&x)

    fmt.Println(x) //prints [7 2 3]
}

有木はよく知っている感じがします...