ホームページ  >  記事  >  バックエンド開発  >  Go スライスに追加しても、同じ基礎となる配列を指す他のスライスに影響を与えないのはなぜですか?

Go スライスに追加しても、同じ基礎となる配列を指す他のスライスに影響を与えないのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-15 00:43:02603ブラウズ

Why Doesn't Appending to a Go Slice Affect Other Slices Pointing to the Same Underlying Array?

スライスに対する追加の動作を理解する

問題の説明:

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

func main() {
    slice := make([]int, 10, 10)
    slice[0] = 0
    slice[1] = 1

    slice1 := slice
    slice1[0] = 10000
    fmt.Println(slice)

    slice1 = append(slice1, 100)
    slice1[0] = 20000

    fmt.Println(slice)
}

最初の出力は期待どおりです。slice とslice1 の両方が、同じ価値観。ただし、slice1 に対する追加操作の後、slice の値は変更されません。スライスがポインタであると仮定すると、この動作は直観に反しているように見えます。

説明:

append 関数は、slice1 を変更しません。 Go はすべての値を値渡しするため、slice1 はスライスのコピーを受け取ります。元の配列がその容量に達したため、追加操作により新しい配列が作成されます。次に、古い配列の内容を新しい配列にコピーし、新しい配列を指す新しいスライス ヘッダーを返します。

戻り値をスライス 1 に割り当てると、スライス 1 が変更されます。ただし、スライスは元の配列を指す別の変数であるため、影響を受けません。したがって、追加操作後にスライス 1 またはスライスの要素に加えられた変更は、他の要素には反映されません。

要約すると、Go のスライスは値渡しであり、追加では新しいスライスを作成します。必要に応じて基礎となる配列を作成します。これは、1 つのスライスに加えられた変更は、元の配列を指す他のスライスには反映されないことを意味します。

以上がGo スライスに追加しても、同じ基礎となる配列を指す他のスライスに影響を与えないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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