103

.clear() プリミティブ型の c++ 関数のようなものを探していmapます。

それとも、代わりに新しいマップを作成する必要がありますか?

更新: ご回答ありがとうございます。回答を見て、新しいマップを作成すると、望ましくない不整合が発生する場合があることに気付きました。次の例を検討してください。

var a map[string]string
var b map[string]string

func main() {
    a = make(map[string]string)
    b=a
    a["hello"]="world"
    a = nil
    fmt.Println(b["hello"])
}

.clear()つまり、これは、オブジェクトのコンテンツをクリアする C++の関数とはまだ異なります。

4

5 に答える 5

134

おそらく、新しいマップを作成する必要があります。同じマップが複数のコードによって参照されていて、この変更が他のコードに見えるように値を明示的にクリアする必要がある場合を除いて、わざわざ既存のものをクリアしようとする本当の理由はありません。

ええ、あなたはおそらくただ言うべきです

mymap = make(map[keytype]valtype)

なんらかの理由で既存のマップを本当にクリアする必要がある場合、これは非常に簡単です。

for k := range m {
    delete(m, k)
}
于 2012-12-11T01:52:07.373 に答える
29

C++ とは異なり、Go はガベージ コレクション言語です。物事を少し違った方法で考える必要があります。

新しい地図を作るとき

a := map[string]string{"hello": "world"}
a = make(map[string]string)

元のマップは最終的にガベージ コレクションされます。手動でクリアする必要はありません。ただし、マップ (およびスライス) は参照型であることを忘れないでください。で作成しますmake()。基になるマップは、参照がない場合にのみガベージ コレクションされます。したがって、あなたがするとき

a := map[string]string{"hello": "world"}
b := a
a = make(map[string]string)

元の配列はガベージ コレクションされません (b がガベージ コレクションされるか、b が別のものを参照するまで)。

于 2012-12-12T06:58:25.827 に答える
1

汎用mapsパッケージの Go イシュー ( https://github.com/golang/go/issues/47649 ) では、maps.Clear.

パッケージは次の場所にありますgolang.org/x/exp/maps(実験的であり、互換性保証の対象外です)

// Clear removes all entries from m, leaving it empty.
func Clear[M ~map[K]V, K comparable, V any](m M)

その使用法

func main() {
    testMap := map[string]int{"gopher": 1, "badger": 2}
    maps.Clear(testMap)
    fmt.Println(testMap)
    
    testMap["zebra"] = 2000
    fmt.Println(testMap)
}

ここでコードを実行します https://go.dev/play/p/qIdnGrd0CYs?v=gotip

于 2022-01-21T23:13:43.260 に答える