删除地图[关键字]吗?


166

我有一张地图:

var sessions =  map[string] chan int{}

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

sessions[key] = nil,false;

那没用。


更新(2011年11月):

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

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

Answers:


153

很奇怪的是,

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

查找值并重新使用它必须更便宜:(sessions["moo"] = sessions["moo"], false;还是这样吗?)
u0b34a0f6ae

除非存在密钥,否则崩溃。我根据您的想法添加了另一个解决方案。

1
在对地图本身进行范围调整时,使用此方法安全吗?
豪尔赫·拉米雷斯

@JorgeRamirez我不这么认为。如果您想这样做,则找到一种方法来遍历一部分键而不是地图对象本身
Seaux

5
为什么第二个解决方案可以更好地利用资源?在第二种解决方案中,您进行两次关键查找,而在第一种解决方案中,您进行一次关键查找。
thebiggestlebowski

86

从Go 1 发行说明复制

在旧的语言中,k要从所代表的地图中删除带有键的条目m,请写下该语句,

m[k] = value, false

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

在Go 1中,语法已消失;而是有一个新的内置函数delete。通话

delete(m, k)

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

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


54

有效出发:

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

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

sessions.go:6: cannot use 0 (type int) as type chan int

3
@Kinopiko:我认为Jurily并不是要OP使用该代码段。他只是从文档中复制了一个示例。
以赛亚书

2
此后看来已被删除,assignment count mismatch: 1 = 2 (use delete)
ghayes 2014年


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
}

更新:更正了我的答案。


sessions.go:6: cannot use 0 (type int) as type chan int

糟糕,忘记了我也删除了该命令:P
以赛亚书

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

上面的代码可以在我的Go版本上编译并运行。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.