"_file_"
go 中是否有任何类似于 go 的函数"_line_"
,以知道谁在运行时调用特定函数?在 C 语言中,我们有"_file_"
可以称为宏的行。如何在 go 中做到这一点?
3 回答
如果您正在使用该log
包,您可以指示记录器为条目添加各种信息的前缀。您可能对Lshortfile
常量最感兴趣,这将导致前缀d.go:23
. 或者,也Llongfile
可以打印文件的完整路径(例如/a/b/c/d.go:23
)。
如果您不想使用该log
包,您也可以使用runtime.Caller()
,这是日志包内部使用的。它不像 C 宏那样直接,但您可以将其隐藏在函数后面(并指定正确的调用深度)。您可以通过示例(第 140 行)查看日志包是如何实现的。
(1) 编写一个简短的函数,调用runtime.Caller()
(2) 在运行时在任何您想访问源代码文件和行号的地方调用该函数。
例子:
import "runtime"
func file_line() string {
_, fileName, fileLine, ok := runtime.Caller(1)
var s string
if ok {
s = fmt.Sprintf("%s:%d", fileName, fileLine)
} else {
s = ""
}
return s
}
注意:将 1 传递给 Caller() 以便它返回调用 file_line() 的行号,而不是调用 runtime.Caller() 的位置。
fmt.Println(file_line()) // Prints this file and line number.
请参阅runtime
andruntime.debug
包,尤其是Stack
, PrintStack
orCaller
函数。
Stack 将调用 goroutine 的堆栈跟踪格式化为 buf 并返回写入 buf 的字节数。如果一切为真,Stack 会将所有其他 goroutine 的堆栈跟踪格式化为当前 goroutine 的跟踪之后的 buf。
如果您使用调试信息进行编译,那么这将包含源代码中的行号