Go 変数が上書きされる
Go ルーチンで、ある変数が設定されているときに別の変数が上書きされるという問題がユーザーから報告されました。具体的には、ユーザーは pathA と pathB という名前の 2 つの整数リストを作成しました。 pathA が三角形の新しい値で拡張されると、最初は正しく設定されていましたが、後で pathB によって上書きされました。
調査
共有が原因で問題が発生します。スライス間のバッキング配列。 Go では、スライスがその容量を超えて拡張されると、新しいバッキング配列が割り当てられ、既存の要素が新しい配列にコピーされます。ただし、スライスの長さがその容量より小さい場合、スライスとその追加要素は同じバッキング配列を共有します。
ユーザーのコードでは、pathA と pathB のサイズが大きくなるにつれて、次の点に達しました。スライスの長さがその容量を超えたため、新しいバッキング配列が pathA に割り当てられました。ただし、次に pathB が作成されたため、同じバッキング配列を使用することになりました。
解決策
この問題を解決するには、ユーザーは pathA と pathA の両方が存在することを確認する必要がありました。 pathB には独立したバッキング配列がありました。これは、make() を使用して pathB に新しいスライスを手動で割り当て、copy() を使用して古いデータをコピーすることで実現されました。
改訂されたコード
変更されたコードは次のとおりです。 :
<code class="go">for i := 0; i < len(prePaths); i++ { newRoute := make([]int, len(prePaths[i]), (cap(prePaths[i]) + 1) * 2) copy(newRoute, prePaths[i]) nextA := nextLine[i] nextB := nextLine[i+1] pathA := append(newRoute, nextA) pathB := append(prePaths[i], nextB) postPaths = append(postPaths, pathA) postPaths = append(postPaths, pathB) }</code>
このコードは、pathA と pathB の両方に独自のバッキング配列があることを保証し、上書きの問題を防ぎます。
以上がGo 変数が上書きされるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。