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