我有一张地图:
var sessions = map[string] chan int{}
如何删除sessions[key]
?我试过了:
sessions[key] = nil,false;
那不起作用。
更新(2011年11月):
删除地图条目的特殊语法已在Go version 1中删除:
Go 1将删除特殊地图分配并引入新的内置函数
delete
:delete(m, x)
将删除由m[x]
表达式检索的地图条目。 ...
答案 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)
在旧语言中,要从地图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
}
更新:更正了我的回答。