golang中的__file__或__line__类似

时间:2013-07-14 14:39:54

标签: c go

go中是否存在与"_file_""_line_"类似的任何函数,以了解在运行时调用特定函数的人员?在C中,我们有"_file_"行,可以称为宏。怎么做去?

3 个答案:

答案 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)

请参阅runtimeruntime.debug个软件包,特别是StackPrintStackCaller functions

  

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

如果您正在使用调试信息进行编译,那么这将包含源

中的行号