繁体   English   中英

如何通过反射将非指针值复制到指针间接值

[英]How to copy a non-pointer value to a pointer indirected value via reflection

我希望下面的Set方法将传入的B结构的APtr字段设置为通过值传入的值,即没有指针间接传递。

为了通过反射实现该功能,我可能必须将该值复制到我拥有地址的新位置? 无论哪种方式,我如何才能使它正常工作? 我有一个非指针值的工作版本。

type A struct {
    AnInt int
}

type B struct {
    AnA   A
    APtr *A
}

func Set(strukt interface{}, fieldName string, newFieldValue interface{}) {
    struktValueElem := reflect.ValueOf(strukt).Elem()
    field := struktValueElem.FieldByName(fieldName)
    newFieldValueValue := reflect.ValueOf(newFieldValue)
    if field.Kind() == reflect.Ptr {
        // ?? implement me
    } else { // not a pointer? more straightforward:
        field.Set(newFieldValueValue)
    }
}

func main() {
    aB := B{}
    anA := A{4}
    Set(&aB, "AnA", anA) // works
    Set(&aB, "APtr", anA) // implement me
}

游乐场: https : //play.golang.org/p/6tcmbXxBcIm

func Set(strukt interface{}, fieldName string, newFieldValue interface{}) {
    struktValueElem := reflect.ValueOf(strukt).Elem()
    field := struktValueElem.FieldByName(fieldName)
    newFieldValueValue := reflect.ValueOf(newFieldValue)
    if field.Kind() == reflect.Ptr {
        rt := field.Type() // type *A
        rt = rt.Elem()     // type A

        rv := reflect.New(rt) // value *A
        el := rv.Elem()       // value A (addressable)

        el.Set(newFieldValueValue) // el is addressable and has the same type as newFieldValueValue (A), Set can be used
        field.Set(rv)              // field is addressable and has the same type as rv (*A), Set can be used
    } else { // not a pointer? more straightforward:
        field.Set(newFieldValueValue)
    }
}

https://play.golang.org/p/jgEK_rKbgO9

https://play.golang.org/p/B6vOONQ-RXO (紧凑)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM