我的 golang 学习笔记系列四:反射初识

根据方法名反射调用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 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!