背景
在编写通用的差异和补丁算法时,我在 Go 语言中遇到了反射问题。
当我尝试在一个切片中进行修补时,reflect.ValueOf(&slice).Elem().Index(0).CanSet()
返回 true。这使我可以修补切片元素内的任何内容,无论是原始数据类型的切片还是结构体的切片。
问题
然而,当我尝试使用映射时,reflect.ValueOf(&map).Elem().MapIndex(reflect.ValueOf("key")).CanSet()
返回 false。这阻止了我尝试对映射内容进行任何操作。
示例
切片
s := []string{"a", "b", "c"}
v := reflect.ValueOf(&s).Elem()
e := v.Index(1)
println(e.String())
println(e.CanSet())
e.Set(reflect.ValueOf("d"))
for _, v := range s {
print(v, " ")
}
output :
b
true
a d c
地图
m := map[string]string{
"a": "1",
"b": "2",
"c": "3"}
mv := reflect.ValueOf(&m).Elem()
println(mv.MapIndex(reflect.ValueOf("a")).CanSet())
output:
false
如何通过反射从Map中获取可修改的值?
谢谢您的时间。
Value.SetMapIndex()
。 - iczareflect.New()
来获得某种类型的新分配值的指针,封装在reflect.Value
中,这将是可设置的。 - icza