Dictionary 通过Go中的反射为结构成员赋值

Dictionary 通过Go中的反射为结构成员赋值,dictionary,reflection,struct,go,Dictionary,Reflection,Struct,Go,我有一个结构v,成员是a,B,C字符串。使用反射,我可以获得字段的名称及其值: typ := v.Type() for i := 0; i < v.NumField(); i++ { // gets us a StructField fi := typ.Field(i) fieldname := fi.Name fmt.Println(fieldname) val := fmt.Sprintf("%v", v.Field(i).Interface()

我有一个结构v,成员是a,B,C字符串。使用反射,我可以获得字段的名称及其值:

typ := v.Type()
for i := 0; i < v.NumField(); i++ {
    // gets us a StructField
    fi := typ.Field(i)
    fieldname := fi.Name
    fmt.Println(fieldname)
    val := fmt.Sprintf("%v", v.Field(i).Interface())
 }
但这显然不起作用。如果只知道字段的名称,是否可以将值赋给结构

实际上,我试图将
map[string]字符串中的值分配给结构中相应的字段,其中结构和映射定义可能会随着时间的推移而扩展,并且映射可能包含比结构更多或更少的值。我曾经考虑过使用JSON,但这种方法让我有点冷淡,因为使用反射“几乎”达到目的是多么容易

谢谢, 肯:是的,这是可能的

导言

由于要访问和修改变量(或字段)的值,因此需要使用类型而不是。你可以通过学习获得它。另外,为了使用反射修改它,需要传递
结构的地址(指针)或要修改的值(否则只能读取它,不能修改它)

但是您不想修改地址/指针,而是要修改指向的值,因此您必须从指针的
导航到指向变量(struct)的
,这就是目的。它看起来是这样的:
reflect.ValueOf(&s).Elem()

您可以使用该方法获取结构字段的
,因为我们将指针的地址传递给
ValueOf()
函数,所以该方法是可设置的

代码

一旦您理解了,代码就比简介简单多了。您也可以在以下网站上试用:

输出:

Before:   {a1 b2 c3}
After:    {2a 2b 2c}
From Map: {ma mb mc}
我建议您阅读这篇博文,了解围棋中反射的基本知识:

var s struct {
    A, B, C string
}
s.A, s.B, s.C = "a1", "b2", "c3"

fmt.Println("Before:  ", s)

v := reflect.ValueOf(&s).Elem()

v.FieldByName("A").SetString("2a")
v.FieldByName("B").SetString("2b")
v.FieldByName("C").SetString("2c")

fmt.Println("After:   ", s)

// Using a map:
m := map[string]string{"A": "ma", "B": "mb", "C": "mc"}
for mk, mv := range m {
    v.FieldByName(mk).SetString(mv)
}

fmt.Println("From Map:", s)
Before:   {a1 b2 c3}
After:    {2a 2b 2c}
From Map: {ma mb mc}