根據方法名反射呼叫golang方法
反射呼叫分為四步:
獲取反射物件
組裝要呼叫的目標方法的引數
呼叫反射方法
反射方法返回的值轉為原有型別
var opers map[string]interface{} func init() { opers = make(map[string]interface{}) opers["-"] = NewSub opers["+"] = NewAdd opers["*"] = NewMul opers["/"] = NewDiv } type OperationAdd struct { Oper *Operation } func NewAdd(num1, num2 int) *OperationAdd { return &OperationAdd{ Oper: &Operation{ num1: num1, num2: num2, }, } } func OperationFactory(num1,num2 int,flag string) OperationInterface { // 獲取到方法 oper := opers[flag] // 獲取反射物件 valueOper := reflect.ValueOf(oper) fmt.Println("反射初始化物件",valueOper) fmt.Printf("反射初始化物件型別為:%T \n",valueOper) // 組裝引數 args := []reflect.Value{ // 引數值 根據順序傳遞 reflect.ValueOf(num1), reflect.ValueOf(num2), } // 呼叫反射 此處返回的是一個切片 [值] arrValueOper 還是reflect.Value物件,需要轉回原有型別 arrValueOper := valueOper.Call(args)[0] fmt.Println("反射返回的引數值為:",arrValueOper) fmt.Printf("反射返回的引數值為型別為:%T \n",arrValueOper) // reflect.Value物件 轉為 interface型別 在繼續轉為原有型別 ret := arrValueOper.Interface().(OperationInterface) fmt.Printf("斷言後的型別為:%T \n",ret) return ret } // 呼叫 ret := OperationFactory(num1,num2,flag)
反射三大原則
將go 的interface{} 變數轉換為反射物件
我們可以從反射物件獲取interfacee{}變數
可以進行原值的修改
本作品採用《CC 協議》,轉載必須註明作者和本文連結