我想知道如何在使用interface{}
值时使用反射来设置变量,并且所有类型的结构都可以传递给func F(o interface{})
。如何将第一个值(s.A)更改为"hello"?
package main
import (
"fmt"
"reflect"
)
type T struct {
A string
}
func main() {
F(T{"foo"})
}
func F(o interface{}) {
t := reflect.ValueOf(&T{"bar"}).Elem()
s := reflect.ValueOf(&o).Elem()
// ok
fmt.Println("struct: ", t.Field(0).CanSet())
// panics - how to set s.A?
fmt.Println("interface:", s.Field(0).CanSet())
}
请参阅http://play.golang.org/p/F6M5mfMOTY
当您将引用值&o
传递给reflect.ValueOf
时,Go将Elem()
解释为interface{}
,而不是您的原始类型。如果您不作为引用传递,则会得到您类型的一个(不可寻址的)实例。我不能100%确定为什么会这样,但你可以在上面的播放链接中看到行为。
一种方法是创建一个新的类型的可寻址实例,然后迭代s
返回的值,设置新实例中的字段,然后返回