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)
的主要区别在于它们获取的调用堆栈层级不同,分别对应直接调用当前函数的函数信息和调用当前函数的函数的调用者的信息。