小编典典

在范围循环内从地图中删除选定的键是否安全?

go

如何从地图上删除选定的键?delete()如下面的代码所示,与范围结合使用是否安全?

package main

import "fmt"

type Info struct {
    value string
}

func main() {
    table := make(map[string]*Info)

    for i := 0; i < 10; i++ {
        str := fmt.Sprintf("%v", i)
        table[str] = &Info{str}
    }

    for key, value := range table {
        fmt.Printf("deleting %v=>%v\n", key, value.value)
        delete(table, key)
    }
}

https://play.golang.org/p/u1vufvEjSw


阅读 189

收藏
2020-07-02

共1个答案

小编典典

这很安全!您还可以在Effective Go中找到类似的示例:

for key := range m {
    if key.expired() {
        delete(m, key)
    }
}

语言规范

未指定地图的迭代顺序,并且不能保证每次迭代之间都相同。如果 在迭代过程删除
尚未到达的地图条目,则不会生成相应的迭代值。如果映射条目是 在迭代过程创建的
,则该条目可能在迭代过程中产生或可以被跳过。对于创建的每个条目以及从一个迭代到下一个迭代,选择可能有所不同。如果映射为nil,则迭代次数为0。

2020-07-02