ホームページ  >  記事  >  バックエンド開発  >  一方の Go 変数を設定すると他方が上書きされるのはなぜですか?

一方の Go 変数を設定すると他方が上書きされるのはなぜですか?

DDD
DDDオリジナル
2024-10-24 08:09:30877ブラウズ

Why Does Setting One Go Variable Overwrite the Other?

Go 変数が上書きされる

このコードでは、作成者は pathB を設定するときに変数 pathA が上書きされるという問題に遭遇しました。これは、両方の変数が同じ基になる配列を参照していることを示唆しており、その結果、一方の変更が他方に影響を及ぼします。

この問題は、Go でのスライスでの append() 関数の使用に起因します。要素をスライスに追加するとき、Go は基になる配列に新しい要素を収容するのに十分な容量があるかどうかを確認します。そうでない場合は、より大きな配列が割り当てられ、既存の要素がコピーされます。

提供されたコードでは、スライス ルートを使用して pathA と pathB の両方を作成します。 pathA または pathB に追加するときに、ルートの基になる配列の容量を超えると、新しい配列が割り当てられます。ただし、pathA と pathB は両方とも同じスライスから派生しているため、同じ基礎となる配列を共有します。

この問題を回避するには、pathA と pathB の初期化に使用する前に、ルートの独立したコピーを作成する必要があります。これは、著者の 2 番目の編集に示すように、make() 関数と copy() 関数を使用して実現できます。

<code class="go">newRoute := make([]int, len(prePaths[i]), (cap(prePaths[i])+1)*2)
copy(newRoute, prePaths[i])

pathA := append(newRoute, nextA)
pathB := append(prePaths[i], nextB)</code>

この改訂されたコードでは、newRoute は独自の基礎となる配列を持つ別個のスライスです。これにより、pathA と pathB にデータの独立したコピーが確保され、一方への変更が他方に影響を与えることがなくなります。

以上が一方の Go 変数を設定すると他方が上書きされるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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