Go言語でスライスを関数の引数に渡すときには参照渡しされます。つまり、関数内でスライスを変更すると、引数として渡した元のスライスにもその変更が反映されます。
以下はそれを検証するサンプルコードです。
package main
import "fmt"
func main() {
slice := []int{1, 2, 3, 4, 5}
double(slice)
fmt.Println(slice) // [2 4 6 8 10]
}
func double(slice []int) {
for i := 0; i < len(slice); i++ {
slice[i] *= 2
}
}
この例では、double
関数が整数のスライスを引数として受け取り、スライス内の各要素を2倍にします。slice
変数で double
関数を呼び出すと、関数は元のスライスの要素を変更します。
これは、double
関数内で slice
を変更したことが、引数として渡した元のスライスにも反映されたことを示しています。
なお、スライスは参照渡しですがスライスヘッダ(スライスの長さや容量に関する情報を含む)は値渡しです。
ややこしいですね。
これはつまり関数内でスライスの長さや容量を変更しても、引数として渡した元のスライスには反映されません。