Go でのマップのディープ コピーとクリア
連想データ構造を操作する場合、多くの場合、マップのディープ コピーを作成し、その後、元の値をクリアして新しい値を受け入れます。ただし、Go では、参照をマップに割り当てるだけではディープ コピーは作成されず、元のマップのクリアに関する問題が発生します。
問題
次のコード:
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 }
このコードでは、aMap のディープ コピーを aSuperMap に作成してクリアしようとします。 aMap が新しい値を取得できるようにします。ただし、aMap から要素を削除すると、両方のマップが同じ基になるデータを参照しているため、aSuperMap からも要素が削除されます。
解決策
要素の真のディープ コピーを作成するにはGo でマップを使用する場合、for ループを使用して、各キーと値のペアを元のマップから新しいマップに手動でコピーする必要があります。 map:
for k, v := range originalMap { newMap[k] = v }
これにより、元のマップoriginalMapから独立した新しいマップnewMapが作成されます。
元のマップのクリア
マップのディープコピーを作成した後、組み込みの len() を使用して元のマップをクリアできますfunction:
length := len(aMap) for i := 0; i < length; i++ { for key := range aMap { delete(aMap, key) } }
これにより、aSuperMap の内容はそのままで、aMap からすべての要素が削除されます。
以上がGo でマップをディープコピーしてクリアするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。