使用反射更新结构中的属性

Ark*_*kon 3 reflection struct go

是否可以更新基于结构的属性?

是否可以根据其 JSON 标签来实现?

假设一个简单的结构:

type User struct {
    Name string `json:"username"`
}
Run Code Online (Sandbox Code Playgroud)

我需要使用反射以编程方式更新Name属性。我尝试了以下方法:

user := User{Name: "John"}
obj := reflect.Indirect(reflect.ValueOf(user))
obj.FieldByName("Name").SetString("Jake")
Run Code Online (Sandbox Code Playgroud)

panic: reflect: reflect.Value.SetString using unaddressable value https://play.golang.org/p/gkBgRXwje57

Cer*_*món 8

要获得可寻址值,请将 的地址传递userreflect.ValueOf

user := User{Name: "John"}
obj := reflect.Indirect(reflect.ValueOf(&user))
obj.FieldByName("Name").SetString("Jake")
fmt.Println(user.Name)
Run Code Online (Sandbox Code Playgroud)

已知在这种情况下该值是一个指针,因此直接调用 Elem() :

user := User{Name: "John"}
obj := reflect.ValueOf(&user).Elem()
obj.FieldByName("Name").SetString("Jake")
fmt.Println(user.Name)
Run Code Online (Sandbox Code Playgroud)