13

"_file_"go 中是否有任何类似于 go 的函数"_line_",以知道谁在运行时调用特定函数?在 C 语言中,我们有"_file_"可以称为宏的行。如何在 go 中做到这一点?

4

3 回答 3

18

如果您正在使用该log包,您可以指示记录器为条目添加各种信息的前缀。您可能对Lshortfile常量最感兴趣,这将导致前缀d.go:23. 或者,也Llongfile可以打印文件的完整路径(例如/a/b/c/d.go:23)。

如果您不想使用该log包,您也可以使用runtime.Caller(),这是日志包内部使用的。它不像 C 宏那样直接,但您可以将其隐藏在函数后面(并指定正确的调用深度)。您可以通过示例(第 140 行)查看日志包是如何实现的。

于 2013-07-14T14:52:36.490 回答
14

(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.
于 2015-10-13T02:51:26.847 回答
2

请参阅runtimeandruntime.debug包,尤其是Stack, PrintStackorCaller函数

Stack 将调用 goroutine 的堆栈跟踪格式化为 buf 并返回写入 buf 的字节数。如果一切为真,Stack 会将所有其他 goroutine 的堆栈跟踪格式化为当前 goroutine 的跟踪之后的 buf。

如果您使用调试信息进行编译,那么这将包含源代码中的行号

于 2013-07-14T14:48:48.253 回答