是的,有可能。
介绍
由于您要访问和修改变量(或字段)的值,因此需要使用
reflect.Value类型而不是
reflect.Type。您可以使用获取它
reflect.ValueOf()。同样,为了通过反射进行修改,您需要传递
struct要修改的或值的地址(指针)(否则,您只能读取它,而不能修改它)。
但你不希望修改地址/指针,但 尖锐的 价值,所以你必须从“导航”
Value的指针的
Value尖头变量(结构),这是什么
Value.Elem()是。看起来像这样:
reflect.ValueOf(&s).Elem()
您可以使用方法获得
Valuestruct字段的
Value.FieldByName(),因为我们传递了指向
ValueOf()函数的指针的地址,所以它是
可设置的 。
代码
一旦理解,该代码比简介简单得多。您也可以在Go
Playground上尝试一下:
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}我建议阅读此博客文章,以了解Go语言中反射的基础知识:
反射定律



