猿问

给定方法值,获取接收者对象

Go 有没有办法从方法值获取接收者对象?


例如,是否有任何这样的东西MagicFunc可以使以下程序my info从底层 Foo 实例输出字符串。


package main


import "fmt"


type Foo struct {

    A string

}


func (foo *Foo) Bar() string {

    return "bar"

}


func MyFunc(val interface{}) {

    i := MagicFunc(val)

    f := i.(Foo)

    fmt.Println(f.A)

}


func main() {

    f := Foo{A: "my info"}

    MyFunc(f.Bar)

}


慕斯王
浏览 100回答 2
2回答

九州编程

不,不可能获取该方法的接收器实例。如果您使用方法表达式而不是方法值,您最多可以获得接收者的类型,但这不会帮助您获取字符串my info。

慕桂英546537

我想深入研究一下,很快就找到了这个文档:https ://golang.org/s/go11func正如那里所描述的,whenMyFunc输入val不包含对 f.Bar 的引用,而是对具有签名的特殊函数的引用func() string。该函数知道它可以通过检查众所周知的寄存器来检索原始 f 指针R0(在示例中。在 amd64 上它似乎是dx,但这显然是一个实现细节)。因此,如果不使用特定于实现的汇编代码就无法做到这一点,这将是非常脆弱的。
随时随地看视频慕课网APP

相关分类

Go
我要回答