我正在寻找像.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"])
}
Run Code Online (Sandbox Code Playgroud)
我的意思是,这仍然与.clear()c ++中的函数不同,后者将清除对象中的内容.
Lil*_*ard 79
您可能应该只创建一个新地图.没有理由去尝试清除现有的一个,除非多个代码引用相同的映射,并且一个明确需要清除值,以便其他代码片段可以看到此更改.
所以,是的,你应该只是说
mymap = make(map[keytype]valtype)
Run Code Online (Sandbox Code Playgroud)
如果您确实需要清除现有地图,无论出于何种原因,这很简单:
for k := range m {
delete(m, k)
}
Run Code Online (Sandbox Code Playgroud)
bla*_*een 26
使用内置的clear.
func main() {\n m := map[string]int{"foo": 1}\n clear(m)\n}\nRun Code Online (Sandbox Code Playgroud)\n这是一个单一的函数调用,并且具有次要但重要的优点,即它将删除非自反键(有关这意味着什么的详细信息,请参阅下文)。标准库maps包已经没有了maps.Clear。
您可以使用maps.Clear。该函数属于该包golang.org/x/exp/maps(实验性且不在兼容性保证范围内)
\n\nClear 删除 m 中的所有条目,使其为空。
\n
用法示例:
\nfunc main() {\n testMap := map[string]int{"gopher": 1, "badger": 2}\n maps.Clear(testMap)\n fmt.Println(testMap)\n \n testMap["zebra"] = 2000\n fmt.Println(testMap)\n}\nRun Code Online (Sandbox Code Playgroud)\n游乐场:https://go.dev/play/p/qIdnGrd0CYs?v =gotip
\n如果你不想依赖实验包,你可以复制粘贴源代码,这实际上非常简单:
\nfunc Clear[M ~map[K]V, K comparable, V any](m M) {\n for k := range m {\n delete(m, k)\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n重要提示:就像使用delete\xe2\x80\x94 的实现maps.Clear使用 \xe2\x80\x94 的内置 \xe2\x80\x94 一样,这不会从映射中删除非自反键。原因是对于非自反键,根据定义,x == x是错误的。非反身键是 NaN 浮点数以及支持比较运算符但在某处包含 NaN 浮点数的所有其他类型。
请参阅此代码以了解这意味着什么:
\nfunc main() {\n m := map[float64]string{}\n m[1.0] = "foo"\n\n k := math.NaN()\n fmt.Println(k == k) // false\n m[k] = "bar"\n\n maps.Clear(m)\n fmt.Printf("len: %d, content: %v\\n", len(m), m) \n // len: 1, content: map[NaN:bar]\n\n a := map[[2]float64]string{}\n a[[2]float64{1.0, 2.0}] = "foo"\n\n h := [2]float64{1.0, math.NaN()}\n fmt.Println(h == h) // false\n a[h] = "bar"\n\n maps.Clear(a)\n fmt.Printf("len: %d, content: %v\\n", len(a), a) \n // len: 1, content: map[[1 NaN]:bar]\n}\nRun Code Online (Sandbox Code Playgroud)\n游乐场:https://go.dev/play/p/LWfiD3iPA8Q
\nJoh*_*ith 12
与C++不同,Go是一种垃圾收集语言.你需要以不同的方式思考问题.
当你制作一张新地图时
a := map[string]string{"hello": "world"}
a = make(map[string]string)
Run Code Online (Sandbox Code Playgroud)
原始地图最终将被垃圾收集; 你不需要手动清除它.但请记住,地图(和切片)是参考类型; 你创建它们make().只有在没有对它的引用时,底层映射才会被垃圾收集.因此,当你这样做
a := map[string]string{"hello": "world"}
b := a
a = make(map[string]string)
Run Code Online (Sandbox Code Playgroud)
原始数组不会被垃圾收集(直到b被垃圾收集或b指的是其他东西).
// Method - I , say book is name of map
for k := range book {
delete(book, k)
}
// Method - II
book = make(map[string]int)
// Method - III
book = map[string]int{}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
52384 次 |
| 最近记录: |