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)
的主要区别在于它们获取的调用堆栈层级不同,分别对应直接调用当前函数的函数信息和调用当前函数的函数的调用者的信息。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
2021-06-22 [BEX] Quasar BEX 提供的那些配置
2014-06-22 开发网上支付的两种方式(图)