如何使用反射在Go(golang)中“删除” map 中的键

7

我正在尝试使用反射从一个map中删除一个key,但是我找不到方法来实现它。我漏掉了什么?以下是我的代码(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将从map中删除该键。对于我的应用程序,我需要实际上从map中删除该键。有什么想法吗?
1个回答

10

与表示地图值类型的零值的reflect.Value不同,SetMapIndex期望reflect.Value本身的零值才能删除键。因此,您需要像这样:

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

一旦你知道了这个,它就变得非常有意义。它也消除了成员资格方面的歧义。谢谢。 - George Madrid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接