golang 反射中调用方法
反射中调用函数众所周知,golang中的函数是可以像普通的int、float等类型变量那样作为值的,例如: package main import "fmt" func hello() { fmt.Println("Hello world!") } func main() { hl := hello hl() } prints: hello world! 既然函数可以像普通的类型变量一样可以的话,那么在反射机制中就和不同的变量一样的,在反射中函数和方法的类型(Type)都是reflect.Func,如果要调用函数的话,可以通过Value的Call方法,例如: func main() { hl := hello fv := reflect.ValueOf(hl) fmt.Println("fv is reflect.Func ?",fv.Kind() == reflect.Func) fv.Call(nil) } prints: fv is reflect.Func? true hello world! Value的Call方法的参数是一个Value的slice,对应的反射函数类型的参数,返回值也是一个Value的slice,同样对应反射函数类型的返回值。通过这个例子,相信你一看就明白了: func prints(i int) string { fmt.Println("i =",i) return strconv.Itoa(i) } func main() { fv := reflect.ValueOf(prints) params := make([]reflect.Value,1) //参数 params[0] := reflect.ValueOf(20) //参数设置为20 rs := fv.Call(params) //rs作为结果接受函数的返回值 fmt.Println("result:",rs[0].Interface().(string)) //当然也可以直接是rs[0].Interface() } prints: i = 20 result: 20 上面说了在反射中调用函数的例子,接下来我们要谈谈反射中方法的调用。函数和方法可以说其实本质上是相同的,只不过方法与一个“对象”进行了“绑定”,方法是“对象”的一种行为,这种行为是对于这个“对象”的一系列操作,例如修改“对象”的某个属性,例如如下: ? type MyType struct { }
需要注意的是上面打印的地址是对象在内存的地址,如果你也运行了这段代码,结果这个地址应该是不同的。 咦,就这样结束了吗?当然不是,细心的读者会发现上面提到的Method好像没用到啊,恩,是的,聪明的你一看API的介绍我相信你就知道如何将上面的代码转换成用Method方法达到同样的效果: (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |