我有地图:
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]
检索的地图条目。 ...
足够奇怪,
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");
}
}
用旧语言,从k
表示的映射中删除键为m
的条目,写了一条语句,
m[k] = value, false
此语法是一种特殊的情况,唯一的二对一分配。它要求传递一个被评估但被丢弃的值(通常被忽略),以及一个几乎总是常量false的布尔值。它确实完成了工作,但很奇怪,也是争论的焦点。
在Go 1中,该语法已消失;而是有一个新的内置函数delete
。通话
delete(m, k)
将删除由表达式m[k]
检索到的映射条目。没有返回值。删除不存在的条目是无操作。
Updating:如果很明显可以从程序中安全地丢弃忽略的值,并且go fix
引用预定义的布尔常量,则运行m[k] = value, false
会将delete(m, k)
形式的表达式转换为false
。修复工具将标记语法的其他用途,以供程序员检查。
来自Effective Go:
要删除地图条目,请使用delete内置函数,其内置参数是地图和要删除的键。即使地图上已经没有钥匙,也可以这样做。
delete(timeZone, "PDT"); // Now on Standard Time
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
}
UPDATE:更正了我的答案。