Go 中的泛型编程,隐式泛型类型

我需要 Go 隐式解析我的结构类型,以便对某些属性进行通用替换。


//must replace the attribute with attValue

func SetAttribute(object interface{}, attributeName string, attValue interface{}, objectType reflect.Type) interface{} {


    /// works perfectly, but function SetAttribute needs to know Customer type to do the convertion

    convertedObject := object.(Customer) // <-- Need to hard code a cast :(


    // doesn't works... raise panic!

    //convertedObject := object 



    value := reflect.ValueOf(&convertedObject).Elem()

    field := value.FieldByName(attributeName)

    valueForAtt := reflect.ValueOf(attValue)

    field.Set(valueForAtt)


    return value.Interface()

}

请查看 Go 游乐场中的完整示例... http://play.golang.org/p/jxxSB5FKEy


缥缈止盈
浏览 169回答 1
1回答

POPMUISE

convertedObject是object接口中内容的值。取那个地址对原来的没有影响customer。(并且被转换可能是名称的一个糟糕的前缀,因为它是从“类型断言”而不是“类型转换”生成的)如果您直接使用 object,它会发生恐慌,因为您正在获取接口的地址,而不是客户。您需要将要修改的客户的地址传递给函数:SetAttribute(&customer, "Local", addressNew, reflect.TypeOf(Customer{}))您还可以先检查 SetAttribute 是否为指针:if reflect.ValueOf(object).Kind() != reflect.Ptr {&nbsp; &nbsp; panic("need a pointer")}value := reflect.ValueOf(object).Elem()&nbsp;field := value.FieldByName(attributeName)valueForAtt := reflect.ValueOf(attValue)field.Set(valueForAtt)return value.Interface()
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go