go中是否存在与"_file_"
或"_line_"
类似的任何函数,以了解在运行时调用特定函数的人员?在C中,我们有"_file_"
行,可以称为宏。怎么做去?
答案 0 :(得分:14)
如果您使用的是log
软件包,则可以指示记录器prefix the entries with various information。您可能最感兴趣的是Lshortfile
常量,这将导致d.go:23
行的前缀。或者,有Llongfile
打印文件的完整路径(例如/a/b/c/d.go:23
)。
如果您不想使用log
包,也可以使用runtime.Caller()
,这是日志包在内部使用的内容。它不像C宏那样直接,但您可以将其隐藏在函数后面(并指定正确的调用深度)。您可以see how the log package is implemented作为示例(第140行)。
答案 1 :(得分:8)
(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.
答案 2 :(得分:2)
请参阅runtime
和runtime.debug
个软件包,特别是Stack
,PrintStack
或Caller
functions。
Stack将调用goroutine的堆栈跟踪格式化为buf,并返回写入buf的字节数。如果全部为真,则在当前goroutine的跟踪之后,Stack格式化所有其他goroutine的跟踪到buf。
如果您正在使用调试信息进行编译,那么这将包含源
中的行号