1. ホーム
  2. go

[解決済み] 地図をコピーするには?

2022-02-27 22:32:21

質問

マップの内容をコピーしようとしているのですが ( amap ) の中にある別のもの ( aSuperMap をクリアしてください。 amap 次の反復/ループで新しい値を取得できるようにするためです。 問題は、マップをクリアできないことです。 をクリアすることなく、その参照先である をスーパーマップの中に入れてください。 以下は擬似的なコードです。

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)
    }
//save aSuperMap
  saveASuperMap(something)

}

動的なものも試しましたが、明らかにエラーになります (nilに代入できません)

aSuperMap[y][x] = aData

問題は、どのようにすれば連想マップを作成できるかということです。PHPでは、単にaSuperMap[y][x] = aDataを使います。golangには明らかなメソッドがないようです。もし私が delete(aMap, x) スーパーマップからの参照も削除されます。もし削除しなければ、スーパーマップは重複したデータで終わります。基本的には、各ループで aMap に、新しい値とすべての古い値を加えたものです。

どのように解決するのですか?

地図をコピーしているのではなく、地図への参照をコピーしているのです。あなたの delete このように、元のマップとスーパーマップの両方の値を変更します。マップをコピーするためには for のようなループがあります。

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

今はもう引退してしまったSOのドキュメントにあった例です。

// Create the original map
originalMap := make(map[string]int)
originalMap["one"] = 1
originalMap["two"] = 2

// Create the target map
targetMap := make(map[string]int)

// Copy from the original map to the target map
for key, value := range originalMap {
  targetMap[key] = value
}

より抜粋 マップ - マップをコピーする . 原作者は JepZ . 帰属の詳細は 投稿者ページ . ソースは以下のライセンスで提供されています。 CC BY-SA 3.0 で見ることができます。 ドキュメント・アーカイブ . 参照トピックID:732、例題ID:9834。