在 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 的唯一方法是 MapIndexMapKeysMapRangeSetMapIndex(如果 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 副本,就像任何其他函数一样。