duanmeng3476 2018-02-01 17:29 采纳率: 0%
浏览 28
已采纳

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

Is it possible to update an attribute in a struct based?

Would it be possible to do it based on its JSON tag?

Supposing a simple structure:

type User struct {
    Name string `json:"username"`
}

I need to update the Name attribute programmatically using reflection. I tried the following:

user := User{Name: "John"}
obj := reflect.Indirect(reflect.ValueOf(user))
obj.FieldByName("Name").SetString("Jake")

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

  • 写回答

1条回答 默认 最新

  • dongtiao0657 2018-02-01 17:31
    关注

    To get an addressable value, pass the address of user to reflect.ValueOf:

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

    It's known that the value is a pointer in this case, so call Elem() directly:

    user := User{Name: "John"}
    obj := reflect.ValueOf(&user).Elem()
    obj.FieldByName("Name").SetString("Jake")
    fmt.Println(user.Name)
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?