删除地图[关键字]吗?

问题描述 投票:137回答:5

我有地图:

var sessions =  map[string] chan int{}

如何删除sessions[key]?我尝试过:

sessions[key] = nil,false;

这没用。


更新(2011年11月):

Go version 1中删除了删除映射条目的特殊语法:

Go 1将删除特殊的地图分配,并引入一个新的内置函数deletedelete(m, x)将删除由表达式m[x]检索的地图条目。 ...

map go
5个回答
125
投票

足够奇怪,

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");
    }
}

75
投票

从Go 1 release notes复制

用旧语言,从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 。修复工具将标记语法的其他用途,以供程序员检查。


42
投票

来自Effective Go

要删除地图条目,请使用delete内置函数,其内置参数是地图和要删除的键。即使地图上已经没有钥匙,也可以这样做。

delete(timeZone, "PDT");  // Now on Standard Time

20
投票
delete(sessions, "anykey")

这些天,什么都不会崩溃。


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
}

UPDATE:更正了我的答案。

© www.soinside.com 2019 - 2024. All rights reserved.