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

convertedObjectobject接口中的值。取其地址对原customer没有影响。(和转换可能是一个糟糕的名称前缀,因为它是由"类型断言"生成的,而不是"类型转换")

如果你直接使用object,它会产生恐慌,因为你取的是接口的地址,而不是客户的地址。

您需要将要修改的客户的地址传递给函数:

SetAttribute(&customer, "Local", addressNew, reflect.TypeOf(Customer{}))

你也可以让你的SetAttribute检查它是否首先是一个指针:

if reflect.ValueOf(object).Kind() != reflect.Ptr {
    panic("need a pointer")
}
value := reflect.ValueOf(object).Elem() 
field := value.FieldByName(attributeName)
valueForAtt := reflect.ValueOf(attValue)
field.Set(valueForAtt)
return value.Interface()

相关内容

  • 没有找到相关文章

最新更新