我试图使用反射从地图中删除一个键,我找不到办法.我错过了什么?我有以下代码(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将从地图中删除该键.
对于我的应用程序,我需要从地图中删除密钥.有任何想法吗?
而不是reflect.Value
表示地图的值类型SetMapIndex
的零值,reflect.Value
而是为了删除密钥,期望自身为零值.所以你反而想要这样的东西:
v.SetMapIndex(reflect.ValueOf("a"), reflect.Value{})
Run Code Online (Sandbox Code Playgroud)