ホームページ  >  記事  >  バックエンド開発  >  Go で同じ配列のスライスに追加すると変数の上書きが発生するのはなぜですか?

Go で同じ配列のスライスに追加すると変数の上書きが発生するのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-10-24 08:11:01390ブラウズ

Why Does Variable Overwrite Occur in Go When Appending to Slices from the Same Array?

Go での変数の上書きの原因

同じバッキング配列に要素を追加して新しいスライス (pathA と pathB) を作成しているため、コードで変数の上書きの問題が発生します。

Go のスライスの背景:

  • Go スライスは、要素の連続ブロックを表すデータ構造です。同じタイプです。
  • スライスには長さ (現在保存されている要素の数) と容量 (保持できる要素の最大数) があります。
  • スライスを変更すると、トリガーされる可能性があります。容量を超えた場合は、新しいバッキング配列が割り当てられます。

コードの問題:

コードでは、2 つの新しいスライスを作成しています。 append 関数を使用した pathA と pathB:

pathA := append(route, nextA)
pathB := append(route, nextB)

次に何が起こります:

  1. 最初、ルートには nextA と nextB の両方に適合する容量があります。したがって、2 つの新しいスライス (pathA と pathB) が、route と同じバッキング配列を使用して作成されます。
  2. ループが進行し、route への追加を続けると、その容量は最終的にその長さを超えます。
  3. ループの後続の反復では、新しいバッキング配列がルートに割り当てられます。ただし、pathA と pathB は引き続き古いバッキング配列を参照します。
  4. nextB を Route に追加すると、pathA と pathB の両方で共有される古いバッキング配列の最後の要素に書き込まれます。
  5. 結果として、pathA と pathB は両方とも同じ最終値になります。

解決策:

この上書きを回避するには、次のことを行う必要があります。 pathA と pathB に一意のバッキング配列があることを確認してください。これを実現するには、make と copy:

newRoute := make([]int, len(route), (cap(route)+1)*2)
copy(newRoute, route)
if i % 2 == 0 {
    pathA := append(newRoute, nextA)
} else {
    pathB := append(newRoute, nextB)
}
を使用して、いずれかの新しいスライスを手動で作成します。

以上がGo で同じ配列のスライスに追加すると変数の上書きが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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