我正在尝试实现一种方法,可以更改具有任意结构的对象中字段的值。当我有指向结构体的指针时,遍历字段没有问题。但是当我拥有一个接口而不是指向结构体的指针时,我无法管理更改字段,简而言之:
// The following doesn't work
var x interface{} = A{Str: "Hello"}
// This panics: reflect: call of reflect.Value.Field on ptr Value
reflect.ValueOf(&x).Field(0).SetString("Bye")
// This panics: reflect: call of reflect.Value.Field on interface Value
reflect.ValueOf(&x).Elem().Field(0).SetString("Bye")
// This panics: reflect: reflect.Value.SetString using unaddressable value
reflect.ValueOf(&x).Elem().Elem().Field(0).SetString("Bye")
// This prints `false`. But I want this to be settable
fmt.Println(reflect.ValueOf(&x).Elem().Elem().Field(0).CanSet())
// This works
var z interface{} = &A{Str: "Hello"}
// This prints `true`
fmt.Println(reflect.ValueOf(z).Elem().Field(0).CanSet())
简述: http://play.golang.org/p/OsnCPvOx8F
我已经阅读了反射定律,因此我知道只有在拥有结构体指针时才能修改字段。所以我的问题是: 如何获得结构体数据的指针?
更新:
我使用基本的y := reflect.New(reflect.TypeOf(x))
使其工作,因此现在可以设置y
的值。有关详细示例,请参见:https://gist.github.com/hvoecking/10772475
y := reflect.New(reflect.TypeOf(x))
创建一个新实例,并将x
的所有字段复制到y
的相应字段中。 - Heye