ホームページ >バックエンド開発 >Golang >複数のスライスが追加されると Go 変数が上書きされるのはなぜですか?

複数のスライスが追加されると Go 変数が上書きされるのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-10-24 07:59:02270ブラウズ

Why Are Go Variables Overwritten When Multiple Slices Are Appended?

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

この問題は、既存のスライスに要素を追加することでそれぞれ定義された複数の変数を設定するときに発生します。ですが、2 番目の変数が設定されると 1 つの変数が上書きされます。

次のコード スニペットを考えてみましょう:

<code class="go">for i := 0; i < len(prePaths); i++ {
    route := prePaths[i]
    nextA := nextLine[i]
    nextB := nextLine[i+1]

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

    postPaths = append(postPaths, pathA)
    postPaths = append(postPaths, pathB)
}</code>

問題はループの 2 行目で、'pathA' と 'pathA' の両方が存在します。 「pathB」は、要素が追加されたスライスとして定義されます。ただし、スライスに追加しても新しいスライスは作成されません。代わりに、既存のスライスを変更します。

このシナリオでは、「ルート」は追加される既存のスライスです。したがって、「pathA」が作成されると、「route」と同じ基礎となる配列を共有します。その後、「pathB」が作成されると、「pathA」と同じ配列も共有します。

「pathB」は追加される最後のスライスであるため、基になる配列の最後の要素は追加された値に設定されます。 「パスB」に。その結果、同じ配列を共有する「pathA」にもこの変更が反映されます。これは、「pathB」が設定されているときに「pathA」が上書きされる理由を説明しています。

この問題を解決するには、「pathA」と「pathB」に独立したスライスを作成する必要があります。これは、「make」関数と「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>

このコードでは、「newRoute」は「make」関数を使用して新しいスライスが作成され、独立したデータが含まれることが保証されます。次に、「copy」関数を使用して、「prePaths[i]」から新しいスライス「newRoute」にデータをコピーします。その後、独立したスライスを使用して「pathA」と「pathB」が定義され、最初の問題は解決されました。

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

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