在 Go 中,我如何使用反射来设置结构上映射的值?
In Go, how can I use reflect to set the value of a map on a struct?
Go中如何使用reflect包设置a的值map
?
package main
import (
"reflect"
)
type Mapped struct {
M map[string]string
}
func main() {
m := map[string]string{"A":"VA", "B": "VB"}
mv := reflect.ValueOf(m)
mapped := Mapped{}
rv := reflect.ValueOf(mapped)
f := rv.FieldByName("M")
// f.Set(mv) doesn't work
}
我看到的与地图有关的 Value
的唯一方法是 MapIndex
、MapKeys
、MapRange
和 SetMapIndex
(如果 map
为零)。
我似乎无法设置地址,因为地图无法寻址。我不确定如何将上面的 m
分配给 mapped.M
.
提前致谢。
您可以通过替换为您的地图获取可寻址值:
rv := reflect.ValueOf(mapped)
与:
rv := reflect.ValueOf(&mapped).Elem()
那你就可以打电话了:
f := rv.FieldByName("M")
f.Set(mv)
和以前一样。
获取指针的值然后使用间接获取 pointed-to 值是造成差异的原因。否则 reflect.ValueOf
会得到你的结构的 non-addressable 副本,就像任何其他函数一样。
Go中如何使用reflect包设置a的值map
?
package main
import (
"reflect"
)
type Mapped struct {
M map[string]string
}
func main() {
m := map[string]string{"A":"VA", "B": "VB"}
mv := reflect.ValueOf(m)
mapped := Mapped{}
rv := reflect.ValueOf(mapped)
f := rv.FieldByName("M")
// f.Set(mv) doesn't work
}
我看到的与地图有关的 Value
的唯一方法是 MapIndex
、MapKeys
、MapRange
和 SetMapIndex
(如果 map
为零)。
我似乎无法设置地址,因为地图无法寻址。我不确定如何将上面的 m
分配给 mapped.M
.
提前致谢。
您可以通过替换为您的地图获取可寻址值:
rv := reflect.ValueOf(mapped)
与:
rv := reflect.ValueOf(&mapped).Elem()
那你就可以打电话了:
f := rv.FieldByName("M")
f.Set(mv)
和以前一样。
获取指针的值然后使用间接获取 pointed-to 值是造成差异的原因。否则 reflect.ValueOf
会得到你的结构的 non-addressable 副本,就像任何其他函数一样。