ホームページ  >  記事  >  バックエンド開発  >  スライスの誤解により Go 変数が上書きされていませんか?

スライスの誤解により Go 変数が上書きされていませんか?

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

Are Go Variables Being Overwritten Due to Slice Misunderstanding?

Go 変数が上書きされる (バグ?)

この場合、問題は Go でスライスがどのように機能するかを理解することにあります。スライスは、配列へのポインターとその長さと容量で構成されます。要素をスライスに追加するとき、スライスを拡張すると基礎となる配列の容量を超えるかどうかが最初にチェックされます。その場合、より大きな配列が割り当てられ、既存の要素がそこにコピーされ、容量が更新されます。次に、新しい要素が配列の末尾に追加され、長さが更新されます。

コードには次の行があります。

<code class="go">pathA := append(route, nextA)
pathB := append(route, nextB)</code>

ここには 2 つの可能性があります。 :

  1. len(route) が cap(route) と等しい場合、新しいバッキング配列が割り当てられ、pathA と pathB は異なる値になります。
  2. If len(route) cap(route) より小さい場合、pathA と pathB は同じバッキング配列を共有することになります。 2 番目に実行されたため、配列の最後の要素は nextB になります。

最初のケースは最初のループ反復では true であり、その後 2 番目のケースが発生するようです。この問題は、copy() と make() を使用してこれらのパスのいずれかのコピーを手動で作成することで解決できます。

以上がスライスの誤解により Go 変数が上書きされていませんか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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