ホームページ >バックエンド開発 >Golang >Go で関数内の配列を変更すると、関数外の同じ配列に割り当てられた変数も変更されるのはなぜですか?

Go で関数内の配列を変更すると、関数外の同じ配列に割り当てられた変数も変更されるのはなぜですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-10-26 01:25:28807ブラウズ

Why does modifying an array inside a function in Go also change a variable assigned to the same array outside the function?

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 サイトの他の関連記事を参照してください。

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