如何从贴图中移除选定关键点? 将delete()与Range组合是否安全,如下面的代码所示?

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

推荐答案

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

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

the language specification:

没有指定映射上的迭代顺序,也不能保证从一次迭代到下一次迭代的顺序相同.如果尚未达到的映射条目为removed during iteration,则不会生成相应的迭代值.如果映射条目为created during iteration,则该条目可能在迭代期间生成,也可能被跳过.对于创建的每个条目,以及从一个迭代到下一个迭代, Select 可能会有所不同.如果贴图为零,则迭代次数为0.

Go相关问答推荐

Docker容器之间的连接被拒绝

Go - os.userHomeDir()在WSL上返回C:\Users\

Golang测试容器,无法使网络正常工作

GORM Find(&;Room)操作使用空数据而不是实际数据填充 struct

带有条件的for循环中缺少RETURN语句

在整个SQL事务中将使用上下文作为默认设置吗?

如何在gofiber/websocket/v2中设置状态代码和原因

将这两个函数合二为一的惯用方法

用 fork 替换 Go 依赖:...用于两个不同的模块路径

命令行参数在 Golang 程序中不正确地接受为参数

Secrets Manager Update Secret - Secret String 额外的 JSON 编码

在两个单独的速率受限端点之间同步请求

具有嵌套重复的正则表达式

无法使用 gocsv 读取引用字段

如何将文件上传到 Google Drive,并与使用服务帐户和 Golang 的任何人共享

在 connect-go 拦截器中修改响应体

Golang 泛型

如何在 docker 文件中安装 golang 包?

退格字符在围棋操场中不起作用

comparable和any有什么区别?