【问题标题】:How to "delete" a key from a map in Go (golang) using reflection如何使用反射从 Go (golang) 中的地图中“删除”一个键
【发布时间】:2014-04-29 23:31:02
【问题描述】:

我正在尝试使用反射从地图中删除一个键,但我找不到执行此操作的方法。我错过了什么?我有以下代码(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 会从地图中删除键。

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

【问题讨论】:

    标签: go


    【解决方案1】:

    SetMapIndex 不希望 reflect.Value 表示映射值类型的零值,而是希望 reflect.Value 本身具有零值以删除键。所以你想要这样的东西:

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

    【讨论】:

    • 这很有意义,只要您知道。它也消除了成员资格的歧义。谢谢。
    猜你喜欢
    • 2017-12-27
    • 2012-03-31
    • 2017-12-06
    • 2021-07-05
    • 2014-03-24
    • 2014-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多