スライスをシャッフルすると、Go で割り当てられたスライスに影響が出るのはなぜですか?

Patricia Arquette
リリース: 2024-10-27 03:57:03
オリジナル
986 人が閲覧しました

Why does shuffling a slice affect a slice assigned to it in Go?

Go での配列の処理

Go では、配列は値型であり、ある配列を別の配列に代入すると、そのすべての要素のコピーが作成されます。これは、関数に配列を渡す場合でも、メモリ参照ではなくコピーを受け取るため当てはまります。

元の質問

次のコード:

<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 と arr が別個のエンティティであることを期待していたにもかかわらず、arr2 がシャッフル関数の影響を受ける理由について混乱を表明しました。

説明

この問題は、配列とスライスの間の誤解から生じています。

配列とスライス

配列は固定長の値のコレクションですが、スライスは基になる配列への動的参照です。提供されているコード例では、配列は使用されていません。

スライス操作

arr := []int{1, 2, 3, 4, 5} 行匿名の基になる配列を参照するスライスを作成します。後続の arr2 := arr 行はこの参照を単純に複製するため、arr と arr2 の両方が同じ基になる配列を指すことになります。

関数の動作

arr をshuffle 関数では、基になる配列ではなく、スライスのコピーが作成されます。このコピーは関数によって変更されるため、arr が変更されると arr2 も影響を受けます。

結論

Go では、スライスは基になる配列への参照として動作します。あるスライスを別のスライスに割り当てると、基になる配列ではなく参照がコピーされます。この概念は、Go でのスライス操作を理解するために非常に重要です。

以上がスライスをシャッフルすると、Go で割り当てられたスライスに影響が出るのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!