通过反射将类型指针的struct字段的接口值设置为struc

时间:2018-03-16 15:26:11

标签: go reflection

我正在尝试设置struct.field =& otherStruct。但是,我必须使用反射,而otherStruct是interface {}类型。

我得到的错误是:

reflect.Set: value of type main.StructB is not assignable to type *main.StructB

结构已知。 (实际)类型的otherStruct是未知的,但保证了赋值是安全的(结构类型是相同的)。

代码:

type StrucA struct {
    Field *StrucB
}

type StrucB struct {}

func main() {
    a := StrucA{}
    var b interface{} = StrucB{}
    //above is set

    // Target: Set a.Field = &b
    reflect.ValueOf(&a).Elem().FieldByName("Field").Set(reflect.ValueOf(b)) // reflect.Set: value of type main.StrucB is not assignable to type *main.StrucB
}

游乐场: https://play.golang.org/p/LR_RgfBzsxa

我测试了很多不同的东西,但我无法解决它。

1 个答案:

答案 0 :(得分:1)

首先需要分配一个指向b类型的指针,以便在某处复制值。获得指针值后,您可以将其设置为Field中的a

field := reflect.New(reflect.TypeOf(b))
field.Elem().Set(reflect.ValueOf(b))
reflect.ValueOf(&a).Elem().FieldByName("Field").Set(field)

https://play.golang.org/p/6-GNSEq0tw3