反射调用函数的过程需要构造大量的 reflect.Value 和中间变量,对函数参数值进行逐一检查,还需要将调用参数复制到调用函数的参数内存中。调用完毕后,还需要将返回值转换为 reflect.Value,用户还需要从中取出调用值。因此,反射调用函数的性能问题尤为突出,不建议大量使用反射函数调用。
通过反射调用方法调用方法和调用函数是一样的,只不过结构体需要先通过rValue.Method()先获取方法再调用,请看如下示例:
package main import ( "fmt" "reflect" ) type MyMath struct { Pi float64 } //普通函数 func (myMath MyMath) Sum(a, b int) int { return a + b } func (myMath MyMath) Dec(a, b int) int { return a - b } func main() { var myMath = MyMath{Pi:3.14159} //获取myMath的值对象 rValue := reflect.ValueOf(myMath) //获取到该结构体有多少个方法 //numOfMethod := rValue.NumMethod() //构造函数参数,传入两个整形值 paramList := []reflect.Value{reflect.ValueOf(30), reflect.ValueOf(20)} //调用结构体的第一个方法Method(0) //注意:在反射值对象中方法索引的顺序并不是结构体方法定义的先后顺序 //而是根据方法的ASCII码值来从小到大排序,所以Dec排在第一个,也就是Method(0) result := rValue.Method(0).Call(paramList) fmt.Println(result[0].Int()) }代码输出结果为:
10Linux公社的RSS地址:https://www.linuxidc.com/rssFeed.aspx