ホームページ >バックエンド開発 >Golang >Go のスライスと配列は、割り当てられて渡されるときに同じように扱われますか?

Go のスライスと配列は、割り当てられて渡されるときに同じように扱われますか?

DDD
DDDオリジナル
2024-10-26 01:23:27343ブラウズ

 Are Go Slices and Arrays Treated the Same When Assigned and Passed?

Go におけるスライスと配列の扱い

Go では、スライスと配列は類似しているにもかかわらず、異なる動作をします。この区別は、割り当て時や引数として渡される時の処理方法に影響します。

配列

配列は、各要素が特定のインデックスを占める固定サイズの要素のコレクションです。ある配列を別の配列に代入すると、サイズに関係なく、すべての要素がコピーされます。これは、割り当てられた配列に加えられた変更は元の配列には影響しないことを意味します。

スライス

スライスは、基になる配列への柔軟で動的な参照です。スライスを別の変数に割り当てると、コピーではなく、同じ基になる配列への参照が作成されます。どちらかのスライスに加えられた変更は、基礎となる配列に影響を与えるため、両方の参照に影響します。

コード例

次の Go コードを考えてみましょう。

<code class="go">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>

この例では、目的は、arr をそのままにして arr2 スライスをシャッフルすることです。ただし、スライスの動作方法により、arr と arr2 は両方とも同じ基になる配列を参照します。したがって、shuffle() が arr 内の要素を交換すると、その変更は arr2 にも反映されます。

結論

結果は「1 5 2 4 3」となり、arr と arr2 のシャッフルを示します。 。この動作は、スライス (参照) と配列 (固定サイズのコレクション) の区別から発生します。 Go で配列を操作するときは、この基本的な違いを認識することが重要です。

以上がGo のスライスと配列は、割り当てられて渡されるときに同じように扱われますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。