我有一张地图:
var sessions = map[string] chan int{}
如何删除sessions[key]?我试着:
sessions[key]
sessions[key] = nil,false;
这并没有起作用。
更新(2011年11月):
在Go版本1中删除映射项的特殊语法被删除:
Go 1将删除特殊的映射赋值,并引入一个新的内置函数delete: delete(m, x)将删除表达式m[x]. ...检索到的映射项
delete
delete(m, x)
m[x]
从有效的去:
要删除一个map条目,使用delete内置函数,其参数是map和要删除的键。这样做是安全的,即使该键已经从映射中缺席。 delete(timeZone, "PDT") // Now on Standard Time
要删除一个map条目,使用delete内置函数,其参数是map和要删除的键。这样做是安全的,即使该键已经从映射中缺席。
delete(timeZone, "PDT") // Now on Standard Time
使用make (chan int)代替nil。第一个值必须与你的映射持有的类型相同。
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 }
修正了我的答案。
Go引入了一个delete(map, key)函数:
delete(map, key)
package main func main () { var sessions = map[string] chan int{}; delete(sessions, "moo"); }
delete(sessions, "anykey")
如今,没有什么东西会崩溃。
在旧语言中,要从由m表示的映射中删除键为k的条目,可以这样写:
m
k
m[k] = value, false
这种语法是一种特殊的情况,只有二比一的赋值。它需要传递一个值(通常被忽略),该值被计算但被丢弃,加上一个布尔值,几乎总是常量false。它确实起了作用,但很奇怪,也是一个争论的焦点。
在Go 1中,这种语法已经消失;取而代之的是一个新的内置函数delete。调用
delete(m, k)
将删除表达式m[k]检索到的映射条目。没有返回值。删除不存在的条目是不允许的。
m[k]
当被忽略的值可以安全地从程序中丢弃,并且false指的是预定义的布尔常量时,运行go fix将把形式为m[k] = value, false的表达式转换为delete(m, k)。修复工具将标记语法的其他用法,以供程序员检查。
false
go fix