268

我有一张地图:

var sessions =  map[string] chan int{}

如何删除sessions[key]?我试过:

sessions[key] = nil,false;

那没有用。

更新(2011 年 11 月):

Go 版本 1中删除了删除地图条目的特殊语法:

Go 1 将删除特殊的映射分配并引入一个新的内置函数,delete:delete(m, x)将删除由表达式检索到的映射条目m[x]。...

4

5 回答 5

266

奇怪的是,

package main

func main () {
    var sessions = map[string] chan int{};
    delete(sessions, "moo");
}

似乎工作。不过,这似乎对资源的使用不佳!

另一种方法是检查是否存在并使用值本身:

package main

func main () {
    var sessions = map[string] chan int{};
    sessions["moo"] = make (chan int);
    _, ok := sessions["moo"];
    if ok {
        delete(sessions, "moo");
    }
}
于 2009-11-15T01:22:41.767 回答
105

复制自 Go 1发行说明

在旧语言中,k要从 表示的映射中删除带有键的条目m,可以编写以下语句,

m[k] = value, false

这种语法是一种特殊的特殊情况,是唯一的二对一赋值。它需要传递一个被评估但被丢弃的值(通常被忽略),加上一个几乎总是为假的布尔值。它完成了这项工作,但很奇怪并且是一个争论点。

在 Go 1 中,该语法已经消失;取而代之的是一个新的内置函数,delete. 通话

delete(m, k)

将删除由表达式检索到的地图条目m[k]。没有返回值。删除不存在的条目是无操作的。

更新:运行go fix会将表单的表达式转换m[k] = value, falsedelete(m, k)当很明显忽略的值可以安全地从程序中丢弃并false引用预定义的布尔常量时。修复工具将标记语法的其他用途以供程序员检查。

于 2012-04-24T20:32:49.627 回答
89

有效的开始:

要删除地图条目,请使用 delete 内置函数,其参数是地图和要删除的键。即使地图中已经没有密钥,这样做也是安全的。

delete(timeZone, "PDT")  // Now on Standard Time
于 2009-11-14T23:55:39.587 回答
39
delete(sessions, "anykey")

这些天来,没有什么会崩溃。

于 2011-07-05T11:56:55.673 回答
1

使用make (chan int)而不是nil. 第一个值必须与您的地图拥有的类型相同。

package main

import "fmt"

func main() {

    var sessions = map[string] chan int{}
    sessions["somekey"] = make(chan int)

    fmt.Printf ("%d\n", len(sessions)) // 1

    // Remove somekey's value from sessions
    delete(sessions, "somekey")

    fmt.Printf ("%d\n", len(sessions)) // 0
}

更新:更正了我的答案。

于 2009-11-15T00:57:13.470 回答