当前位置: 首页 > 面试题库 >

是否可以获取有关Golang中调用方函数的信息?

空翼
2023-03-14
问题内容

是否可以获取有关Golang中调用方函数的信息?例如,如果我有

func foo() {
    //Do something
}
func main() {
    foo() 
}

我怎样才能得到那个foomain
我可以使用其他语言(例如,在C#中,我只需要使用CallerMemberNameclass属性)


问题答案:

扩展我的评论,这是一些返回当前func调用者的代码

import(
    "fmt"
    "runtime"
)

func getFrame(skipFrames int) runtime.Frame {
    // We need the frame at index skipFrames+2, since we never want runtime.Callers and getFrame
    targetFrameIndex := skipFrames + 2

    // Set size to targetFrameIndex+2 to ensure we have room for one more caller than we need
    programCounters := make([]uintptr, targetFrameIndex+2)
    n := runtime.Callers(0, programCounters)

    frame := runtime.Frame{Function: "unknown"}
    if n > 0 {
        frames := runtime.CallersFrames(programCounters[:n])
        for more, frameIndex := true, 0; more && frameIndex <= targetFrameIndex; frameIndex++ {
            var frameCandidate runtime.Frame
            frameCandidate, more = frames.Next()
            if frameIndex == targetFrameIndex {
                frame = frameCandidate
            }
        }
    }

    return frame
}

// MyCaller returns the caller of the function that called it :)
func MyCaller() string {
        // Skip GetCallerFunctionName and the function to get the caller of
        return getFrame(2).Function
}

// foo calls MyCaller
func foo() {
    fmt.Println(MyCaller())
}

// bar is what we want to see in the output - it is our "caller"
func bar() {
    foo()
}

func main(){
    bar()
}

有关更多示例:https :
//play.golang.org/p/cv-SpkvexuM



 类似资料:
  • 我仍然是AnyLogic和JAVA的基本用户,但我遇到了获取服务块剩余时间的问题。我知道服务块嵌入了延迟块,并且有一个用于延迟的函数(getRemainingTime(代理))。是否可以在(代理)main中调用此函数? 我需要获得我的产品将停留在服务块的时间,以导航我的推送过程。我有3个产品(都是个人代理)和一个在服务前装配我的产品和1个原材料(个人代理)的拾取块。显然,剩余时间必须是动态的,并且

  • 问题内容: 我有以下测试方法,该方法使用从包中导入的函数。 可以在golang中进行模拟吗? 问题答案: 是的,只需进行简单的重构即可。创建一个函数类型的变量,用初始化,并让您的包调用而不是: 在测试中,您可以为分配另一个功能,该功能是在测试中定义的,并且可以执行测试所需的功能。 例如:

  • 问题内容: javascript中的函数通过保持与其隐藏范围的(隐藏)链接来形成关闭。 当我们拥有函数(作为变量值)时,是否可以通过编程方式访问它? 真正的目标是理论上的,但一个演示可能是列出闭合的属性。 问题答案: 这是关闭的目的之一(使信息保密)。由于该函数已经执行,因此它的作用域变量不再可从外部获得(并且从未使用过)-只有在其作用域中执行的函数(仍然)可以访问。 但是,您可以通过getter

  • 问题内容: 我正在使用softlayer go客户端 https://github.com/softlayer/softlayer- go 我无法关闭softlayer会话。我怎么做? 我已经使用API 创建了softlayer会话。参考:-https : //github.com/softlayer/softlayer- go/blob/master/session/session.go 问题答

  • 问题内容: 假设我有一个实现Runnable接口的抽象基类。 这是一些派生类之一。 关键是我希望我的基类做一些常规的事情,而不是每次都复制它。实际上,它运行良好,输出始终相同: 基本构造函数使用参数1创建的派生线程使用参数1运行派生 但是在JAVA中启动在构造函数中调用抽象方法的线程是否安全?因为据我所知,在大多数情况下,在C ++和C#中是不安全的。谢谢! 问题答案: 此代码演示了为什么你应该

  • 问题内容: 如果我想调用这样的函数: 通常,我必须这样表达我的函数定义: 但是,这种出色的语法在spidermonkey中对于定义函数完全有效: 这是什么功能? 问题答案: 这称为解构。您可能会在MDN:解构分配中找到最多的信息尤其是查看[从作为函数参数传递的对象中解包字段。 。