我正在編寫(xiě)一個(gè)通用緩存機(jī)制,我需要在結(jié)構(gòu)中設(shè)置一些屬性,只知道它們的reflect.Type、屬性名稱和reflect.Value 要在屬性中設(shè)置,但我無(wú)法避免類型斷言,這使得我的代碼不通用...func main() { addressNew := Address{"New Address description!"} // In the real problem, i know the reflect.Type of value, but // the struct came to me as a interface{}, just like this method // Return many kinds of values from redis as interface{}, // (Customer, Order, Address, Product, SKU etc), in a generic way, // but returns the reflect.Type of value also. interfaceSomeValue := getMyValue() fmt.Printf("%v", interfaceSomeValue) fmt.Println("") // This portion of code comes from my cache mechanism, that is a library // used by other projects. My cache lib really can't know all others // type structs to perform the type assertion, but the cache mechanism know // the reflect.Type of the interface. // If you try at this way, will cause a panic by try to access a FieldByName // in a interface, because the Customer comes from getMyValue and // becomes a interface{}, and now a type assertion is // required -> http://play.golang.org/p/YA8U9_KzC9 newCustomerNewAttribute := SetAttribute(&interfaceSomeValue, "Local", interface{}(addressNew), reflect.TypeOf(Customer{})) fmt.Printf("%v", newCustomerNewAttribute) fmt.Println("")}func SetAttribute(object interface{}, attributeName string, attValue interface{}, objectType reflect.Type) interface{} { 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()}
- 1 回答
- 0 關(guān)注
- 206 瀏覽
添加回答
舉報(bào)
0/150
提交
取消