http://golang.org/doc/Effective_go.html#arrays のドキュメントでは、Go における配列の値ベースの性質が強調されています。配列を別の配列に代入すると、すべての要素のコピーが作成されます。この原則は、関数の引数にも適用され、関数はポインタではなく配列のコピーを受け取ります。
この情報に基づいて、次のコードは、arr2 と arr に異なる配列を生成すると予想されます。 main() function:
<code class="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) } }</code>
しかし、コードは予期せず arr2 もシャッフルします。この動作は、提供されたコードが配列ではなくスライスで動作するという事実に由来します。
Go は、値のシーケンスを処理するためのより柔軟かつ効率的な方法としてスライスを利用します。 。スライスは基になる配列への参照であり、あるスライスを別のスライスに割り当てると、その参照が単純に複製されます。
コード例では、arr := []int{1, 2, 3, 4, 5} 行によって匿名の基になる整数配列を参照するスライス。 arr2 := arr が実行されると、同じ基になる配列も参照する新しいスライスが作成されます。
arr と arr2 は両方とも同じ基になる配列を参照するため、arr を変更しますshuffle() 関数内の arr2 も影響します。この動作は、基になる配列の新しいコピーを作成するのではなく、単に参照を複製するだけで、あるスライスを別のスライスに割り当てるという原則と一致しています。
したがって、コードは arr と arr2 の両方を正しくシャッフルします。これは、両方とも同じ基になるものを参照するためです。整数の配列
以上がスライスをシャッフルすると、同じ基礎となる配列を参照する別のスライスに影響を与えるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。