我正在阅读reflect.MakeFunc,并想知道是否还有一种方法可以在运行时创建Method(带接收器的函数)。
答案 0 :(得分:2)
不,这是不可能的,因为如果你这样做,接收者的类型method set会在运行时改变。您可能知道,Go在其当前实现中是在编译时进行类型检查。如果类型可能在运行时突然获取(或丢失)方法,则需要对每个接受参数的函数调用进行运行时接口实现检查。
在运行时创建方法(带接收器的函数)的方法
但从技术上讲,可以通过分支反射包来构建一个表示附加到任意类型的方法的值。但是,这不会改变所述类型的方法集,因为它本质上是围绕Go类型系统的黑客攻击。
如何在对象上交换方法指针?
去,不像,例如Java没有在具体值only in interface values中嵌入虚方法调度表。如果您愿意亲自动手,可以抓住reflect.nonEmptyInterface
并修改其 itable (itab字段)。