Go言語で配列を操作する関数を書く

Go言語で配列の中身を操作する関数を書いてみた。
C言語では配列変数はアドレスだから、Go言語でもたぶん同じだろうと思いプログラムを書いてみたのだが、上手くいかない。 :^(

■bad_chgarr.go

package main

import "fmt"

func chg_array(data [10]int) {
	for i := 0; i < len(data); i++ {
		data[i] = i
	}
	fmt.Println(data)
}

func main() {
	var data [10]int
	chg_array(data)
	fmt.Println(data)
}

(実行結果)

$ go run bad_chgarr.go
[0 1 2 3 4 5 6 7 8 9]
[0 0 0 0 0 0 0 0 0 0]

解決策

どうやら、Go言語では配列を関数に渡すと、参照渡しではなく値渡しされるみたいです。
Go言語の内部仕様がどうなってるのかは不明ですが、配列変数のアドレスを渡してやりました。

■good_chgarr.go

package main

import "fmt"

func chg_array(data *[10]int) {
	for i := 0; i < len(data); i++ {
		data[i] = i
	}
	fmt.Println(*data)
}

func main() {
	var data [10]int
	chg_array(&data)
	fmt.Println(data)
}

(実行結果)

$ go run good_chgarr.go 
[0 1 2 3 4 5 6 7 8 9]
[0 1 2 3 4 5 6 7 8 9]

よし、成功。