我的 golang 学习笔记系列四:反射初识
根据方法名反射调用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 协议》,转载必须注明作者和本文链接
推荐文章: