如何使用反射从Go(golang)中的地图"删除"一个键

Geo*_*rid 5 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)
}
Run Code Online (Sandbox Code Playgroud)

这会产生输出:

DELETE: map[b:true]
ASSIGN: map[a:false b:true]
REFLECT: map[a:false b:true]
Run Code Online (Sandbox Code Playgroud)

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

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

对于我的应用程序,我需要从地图中删除密钥.有任何想法吗?

Jam*_*dge 7

而不是reflect.Value表示地图的值类型SetMapIndex的零值,reflect.Value而是为了删除密钥,期望自身为零值.所以你反而想要这样的东西:

v.SetMapIndex(reflect.ValueOf("a"), reflect.Value{})
Run Code Online (Sandbox Code Playgroud)