作者热门文章
- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我需要 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 Playground 中的完整示例... http://play.golang.org/p/jxxSB5FKEy
最佳答案
convertedObject
是 object
接口(interface)中的值。获取地址对原始 customer
没有影响。 (并且 converted 可能是名称的不良前缀,因为它是从“类型断言”而不是“类型转换”生成的)
如果您直接使用对象,它会崩溃,因为您随后获取的是接口(interface)的地址,而不是客户的地址。
需要将要修改的客户地址传递给函数:
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()
关于go - Go 中的泛型编程,隐式泛型类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30580941/
我是一名优秀的程序员,十分优秀!