知识卡片
动态调用更贵
内容
反射方法调用需要查找元数据、组装参数并通过运行时路径执行,比静态调用重很多。高频路径中,生成代码或显式接口通常比反射更可控。
参考来源
- 位置:《Go语言底层原理剖析》第13章《反射高级编程》13.3.5节《动态调用剖析》
- 结论依据:原文拆解 Call 方法的核心步骤:"第1步是获取函数的指针……第2步是进行有效性验证,例如函数的输入大小和个数是否与传入的参数匹配……第3步是调用funcLayout函数,用于构建函数参数及返回值的栈帧布局……调用Call汇编函数完成调用逻辑",因此可以推出"反射方法调用需要查找元数据、校验、组装参数并走专门的汇编调用路径,比静态调用重得多"的结论。
- 原始内容:动态调用的核心方法是Call方法,其参数为reflect.Value数组,返回的也是reflect.Value数组……Call方法的第1步是获取函数的指针,对于方法的调用要略微复杂一些,会调用methodReceiver方法获取调用者的实际类型、函数类型,以及函数指针的位置。第2步是进行有效性验证,例如函数的输入大小和个数是否与传入的参数匹配,传入的参数能否赋值给函数参数等。第3步是调用funcLayout函数,用于构建函数参数及返回值的栈帧布局。