Ron*_*nna 5 reflection methods runtime go
我正在阅读有关reflect.MakeFunc的内容,并且想知道是否还有一种方法可以在运行时创建方法(带有接收器的函数)。
不,这是不可能的,因为如果您这样做,接收者的类型方法集将在运行时更改。如您所知,Go 在其当前实现中是在编译时进行类型检查的。如果类型可能在运行时突然获取(或丢失)方法,则需要对每个采用接口参数的函数调用进行运行时接口实现检查。
一种在运行时创建方法(带有接收器的函数)的方法
但从技术上讲,您可以通过分叉反射包来构建一个表示附加到任意类型的方法的值。然而,这不会改变所述类型的方法集,因为它本质上是对 Go 类型系统的黑客攻击。
交换对象上的方法指针怎么样?
Go 与 Java 不同,它不会将虚拟方法调度表嵌入到具体值中,而仅嵌入到接口值中。如果您愿意亲自动手,您可以获取 areflect.nonEmptyInterface并修改它的itable(itab 字段)。