如何"删除"来自Go(golang)地图的一个关键字

时间:2014-04-29 15:23:05

标签: go

我正在尝试使用反射从地图中删除一个键,我找不到办法。我错过了什么?我有以下代码(http://play.golang.org/p/7Et8mgmSKO):

package main

import (
    "fmt"
    "reflect"
)

func main() {
    m := map[string]bool{
        "a": true,
        "b": true,
    }

    delete(m, "a")
    fmt.Printf("DELETE: %v\n", m)

    m = map[string]bool{
        "a": true,
        "b": true,
    }

    m["a"] = false
    fmt.Printf("ASSIGN: %v\n", m)

    m = map[string]bool{
        "a": true,
        "b": true,
    }
    v := reflect.ValueOf(m)
    v.SetMapIndex(reflect.ValueOf("a"), reflect.Zero(reflect.TypeOf(m).Elem()))
    fmt.Printf("REFLECT: %v\n", m)
}

生成输出:

DELETE: map[b:true]
ASSIGN: map[a:false b:true]
REFLECT: map[a:false b:true]

如您所见,反射情况似乎与分配零值相同,而不是删除它。这似乎与reflect.SetMapIndex()的文档相反,后者表示(http://golang.org/pkg/reflect/#Value.SetMapIndex):

  

如果val为零值,则SetMapIndex将从地图中删除该键。

对于我的应用程序,我需要实际从地图中删除密钥。有什么想法吗?

1 个答案:

答案 0 :(得分:7)

reflect.Value不是代表地图值类型零值的SetMapIndex,而是reflect.Value本身需要零值才能删除密钥。所以你想要这样的东西:

v.SetMapIndex(reflect.ValueOf("a"), reflect.Value{})