go中删除地图[key]?

时间:2009-11-14 23:46:44

标签: map go

我有一张地图:

var sessions =  map[string] chan int{}

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

sessions[key] = nil,false;

那不起作用。


更新(2011年11月):

删除地图条目的特殊语法已在Go version 1中删除:

  

Go 1将删除特殊地图分配并引入新的内置函数deletedelete(m, x)将删除由m[x]表达式检索的地图条目。 ...

5 个答案:

答案 0 :(得分:86)

奇怪的是,

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");
    }
}

答案 1 :(得分:66)

从Go 1 release notes

复制

在旧语言中,要从地图k中删除带有键k的条目,就会写​​一句话,

m[k] = value, false

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

在Go 1中,语法已经消失;相反,有一个新的内置函数delete。电话

delete(m, k)

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

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

答案 2 :(得分:28)

来自Effective Go

  

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

delete(timeZone, "PDT");  // Now on Standard Time

答案 3 :(得分:16)

delete(sessions, "anykey")

现在,什么都不会崩溃。

答案 4 :(得分:0)

使用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
}

更新:更正了我的回答。