「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Go で同じ配列のスライスに追加すると変数の上書きが発生するのはなぜですか?

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

2024 年 11 月 10 日に公開
ブラウズ:510

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

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

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

Go のスライスの背景:

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

コードの問題:

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

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

次に何が起こります:

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

解決策:

この上書きを回避するには、次のことを行う必要があります。 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)
}
リリースステートメント この記事は次の場所に転載されています: 1729727920 権利侵害がある場合は、[email protected] に連絡して削除してください。
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3