Go における配列の処理
Go では、配列は参照ではなく値です。したがって、ある配列を別の配列に代入すると、すべての要素がコピーされます。さらに、配列を関数に渡すと、ポインタではなくコピーが提供されます。
コード例の説明
次のコード例を考えてみましょう。
package main import ( "fmt" "rand" "time" ) func shuffle(arr []int) { rand.Seed(time.Nanoseconds()) for i := len(arr) - 1; i > 0; i-- { j := rand.Intn(i) arr[i], arr[j] = arr[j], arr[i] } } func main() { arr := []int{1, 2, 3, 4, 5} arr2 := arr shuffle(arr) for _, i := range arr2 { fmt.Printf("%d ", i) } }
このコードでは、shuffle 関数は配列を入力として受け取り、その要素をシャッフルします。ただし、shuffle を呼び出す前に元の配列を新しい変数 arr2 に代入しても、関数内で arr に加えた変更は arr2 に反映されます。
スライスと配列
Go はスライスと配列を区別します。配列は固定長の値のリストですが、スライスは基になる配列への参照です。コード例では、arr と arr2 は両方とも同じ基になる配列を参照します。その結果、arr に加えられた変更は arr2 にも適用されます。配列の個別のコピーを作成するには、make:
arr := []int{1, 2, 3, 4, 5} arr2 := make([]int, len(arr)) copy(arr2, arr)
を使用してスライスを割り当てる必要があります。この更新されたバージョンでは、arr2 は元の配列への参照ではなくなったため、arr に加えられた変更は影響を受けません。 arr2.
以上がGo で関数内の配列を変更すると、関数外の同じ配列に割り当てられた変数も変更されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。