我正在尝试使用反射从地图中删除一个键,我找不到办法。我错过了什么?我有以下代码(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将从地图中删除该键。
对于我的应用程序,我需要实际从地图中删除密钥。有什么想法吗?
答案 0 :(得分:7)
reflect.Value
不是代表地图值类型零值的SetMapIndex
,而是reflect.Value
本身需要零值才能删除密钥。所以你想要这样的东西:
v.SetMapIndex(reflect.ValueOf("a"), reflect.Value{})