【Go言語】スライスを関数の引数で渡すときは値渡しなのか参照渡しなのか?答えは参照渡しです

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 を変更したことが、引数として渡した元のスライスにも反映されたことを示しています。

なお、スライスは参照渡しですがスライスヘッダ(スライスの長さや容量に関する情報を含む)は値渡しです。

ややこしいですね。

これはつまり関数内でスライスの長さや容量を変更しても、引数として渡した元のスライスには反映されません。