golang runtime.Caller 获取调用堆栈信息, Caller(1) 和 Caller(2) 的区别

 

复制代码
func whoCalledMe() {
    // 获取调用堆栈信息
    _, fileName, lineNo, ok := runtime.Caller(2)
    if !ok {
        fmt.Println("Failed to get caller information")
        return
    }
    fmt.Printf("Called from: %s:%d\n", fileName, lineNo)
}
复制代码

 

runtime.Caller 函数用于获取调用堆栈信息。它接受一个参数,表示要上溯的栈帧数(skip),并返回对应的调用信息,包括程序计数器(pc)、文件名(file)和行号(line)。

runtime.Caller 函数的参数决定了它回溯调用堆栈的深度。这里的区别在于:

  • runtime.Caller(1):当在函数中调用 runtime.Caller(1) 时,它会返回调用 Caller 函数的函数的堆栈信息。换句话说,它跳过了当前函数这一层,直接获取调用当前函数的那个函数的上下文。这在记录日志、调试信息时非常有用,可以让你知道是哪个函数触发了当前的调用。

  • runtime.Caller(2):而使用 runtime.Caller(2) 则会进一步上溯一层堆栈。这意味着它不仅跳过了当前函数,还跳过了直接调用当前函数的那一层,返回的是调用当前函数的那个函数的调用者的信息。这对于需要了解更深层次调用链的场景很有帮助

总结来说,runtime.Caller(1) 和 runtime.Caller(2) 的主要区别在于它们获取的调用堆栈层级不同,分别对应直接调用当前函数的函数信息和调用当前函数的函数的调用者的信息。

 

Link:https://www.cnblogs.com/farwish/p/18261766

posted on   ercom  阅读(112)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
历史上的今天:
2021-06-22 [BEX] Quasar BEX 提供的那些配置
2014-06-22 开发网上支付的两种方式(图)

统计

点击右上角即可分享
微信分享提示