登录
首页 >  Golang >  Go问答

获得给定函数的接收者对象

来源:stackoverflow

时间:2024-03-18 13:18:29 161浏览 收藏

Go 语言中,无法从方法值获取接收者对象。当使用魔法函数获取方法值时,只能获得接收者的类型,无法获得具体实例。因此,无法通过这种方式获取接收者的信息。

问题内容

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

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

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)
}

解决方案


不,不可能获取该方法的接收器实例。

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

我想深入研究一下这个问题,很快就找到了这个文档:https://golang.org/s/go11func

如此处所述,当输入 MyFunc 时,val 不包含对 f.Bar 的引用,而是包含签名为 func() string 的特殊函数。该函数知道它可以通过检查众所周知的 R0 寄存器来检索原始 f 指针(在示例中。在 amd64 上它似乎是 dx,但这显然是一个实现细节)。

因此,如果不使用特定于实现的汇编代码就无法做到这一点,这将非常脆弱。

今天带大家了解了的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>