为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
缥缈止盈 2021-10-11 10:46:21
我需要 Go 隐式解析我的结构类型,以便对某些属性进行通用替换。//must replace the attribute with attValuefunc 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
查看完整描述

1 回答

?
POPMUISE

TA贡献1765条经验 获得超5个赞

convertedObject是object接口中内容的值。取那个地址对原来的没有影响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()


查看完整回答
反对 回复 2021-10-11
  • 1 回答
  • 0 关注
  • 166 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信