ホームページ >バックエンド開発 >Golang >Go マップをディープ コピーし、コピーに影響を与えずにオリジナルをクリアする方法は?

Go マップをディープ コピーし、コピーに影響を与えずにオリジナルをクリアする方法は?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-30 13:05:09510ブラウズ

How to Deep Copy a Go Map and Clear the Original Without Affecting the Copy?

Go で連想マップを作成する: オリジナルをディープ コピーしてクリアする方法

Go でコンテンツをコピーしようとしていますaMap というマップを aSuperMap という別のマップに変換します。次に、次のループ反復で新しい値を受け入れるために aMap をクリアします。ただし、SuperMap 内の参照もクリアせずにマップをクリアするという問題に直面しています。

参照に関する問題

疑似コードは、削除するときのことを示しています。 delete(aMap, x) を使用して aMap から項目を削除すると、その項目への参照も aSuperMap から削除されます。これは、aSuperMap[y] が aMap への参照を保持しており、aMap を変更すると (この場合は項目を削除することで)、実際には aSuperMap が指す基になるデータを変更することになるためです。

マップのディープ コピー

Go で実際に連想マップを作成するには、地図。これには、元のマップへの参照を単に保持するのではなく、データの独自のコピーを含む新しいマップ オブジェクトを作成することが含まれます。

これを実現するには、元のマップを反復処理して追加する for ループを手動で作成します。各キーと値のペアを新しいマップに追加します:

for k, v := range originalMap {
    newMap[k] = v
}

これを実行すると、元のマップと同じデータを含む新しいマップが作成されますが、2 つのマップは独自のコピーを持つ別個のオブジェクトになります。

元のマップのクリア

マップのディープ コピーを取得したら、新しいマップに影響を与えることなく元のマップをクリアできます。これを行うには、コンテナ/リスト パッケージのリセット関数を使用できます。

for something := range fruits {
    aMap := make(map[string]aStruct)
    aSuperMap := make(map[string]map[string]aStruct)

    for x := range something {
        aMap[x] = aData
        aSuperMap[y] = aMap
        delete(aMap, x)
    }

    // Deep copy aMap into newMap
    newMap := make(map[string]aStruct)
    for k, v := range aMap {
        newMap[k] = v
    }

    // Clear the original aMap
    container/list.Reset(aMap)

    // Save the new map
    saveASuperMap(newMap)
}

次の手順に従うことで、Go で関連付けマップを正常に作成し、マップのディープ コピーを実行して保存することができます。元のデータを削除し、次のループ反復で新しい値を受け入れるために元のマップをクリアします。

以上がGo マップをディープ コピーし、コピーに影響を与えずにオリジナルをクリアする方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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