我有一张地图:

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
}

更新:更正了我的答案。

其他回答

来自Effective Go:

要删除一个map条目,使用delete内置函数,其参数是map和要删除的键。这样做是安全的,即使该键已经从映射中缺席。 delete(timeZone, "PDT") //现在是标准时间

delete(sessions, "anykey")

如今,没有什么东西会崩溃。

使用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 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指的是预定义的布尔常量。修复工具将标记语法的其他用法,以供程序员检查。

Go引入了delete(map, key)函数:

package main

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