为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
交互式爱情 2021-12-07 18:38:26
是否可以在 Golang 中获取有关调用者函数的信息?例如,如果我有func foo() {    //Do something}func main() {    foo() }我怎样才能得到那个foo已经被调用的main?我可以用其他语言(例如在 C# 中,我只需要使用CallerMemberNameclass 属性)
查看完整描述

2 回答

?
大话西游666

TA贡献1817条经验 获得超14个赞

您可以runtime.Caller用于轻松检索有关呼叫者的信息:


func Caller(skip int) (pc uintptr, file string, line int, ok bool)

示例 #1:打印调用者文件名和行号:https : //play.golang.org/p/cdO4Z4ApHS


package main


import (

    "fmt"

    "runtime"

)


func foo() {

    _, file, no, ok := runtime.Caller(1)

    if ok {

        fmt.Printf("called from %s#%d\n", file, no)

    }

}


func main() {

    foo()

}

示例 #2:获取更多信息runtime.FuncForPC:https : //play.golang.org/p/y8mpQq2mAv


package main


import (

    "fmt"

    "runtime"

)


func foo() {

    pc, _, _, ok := runtime.Caller(1)

    details := runtime.FuncForPC(pc)

    if ok && details != nil {

        fmt.Printf("called from %s\n", details.Name())

    }

}


func main() {

    foo()

}


查看完整回答
反对 回复 2021-12-07
?
临摹微笑

TA贡献1982条经验 获得超2个赞

扩展我的评论,这里有一些代码返回当前 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


查看完整回答
反对 回复 2021-12-07
  • 2 回答
  • 0 关注
  • 153 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信