我的 golang 學習筆記系列四:反射初識

hengbo_liu發表於2021-10-16

根據方法名反射呼叫golang方法

反射呼叫分為四步:

  1. 獲取反射物件

  2. 組裝要呼叫的目標方法的引數

  3. 呼叫反射方法

  4. 反射方法返回的值轉為原有型別

    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)

    反射三大原則

  5. 將go 的interface{} 變數轉換為反射物件

  6. 我們可以從反射物件獲取interfacee{}變數

  7. 可以進行原值的修改

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章