_文件_或_行_类似于golang

zdwk9cvp  于 2023-02-17  发布在  Go
关注(0)|答案(4)|浏览(201)

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

pb3skfrl

pb3skfrl1#

如果你使用的是log包,你可以命令日志记录器在条目前面加上各种信息。你可能对Lshortfile常量最感兴趣,它会产生d.go:23这样的前缀。或者,Llongfile可以打印文件的完整路径(比如/a/b/c/d.go:23)。
如果你不想使用log包,你也可以使用runtime.Caller(),这是日志包内部使用的,它不像C宏那样直接,但是你可以把它隐藏在一个函数后面(并指定正确的调用深度),比如see how the log package is implemented(第140行)。

r7knjye2

r7knjye22#

(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.
t3psigkw

t3psigkw3#

请参阅runtimeruntime.debug软件包,特别是StackPrintStackCallerfunctions
Stack将调用方goroutine的堆栈跟踪格式化为buf,并返回写入buf的字节数,如果全部为真,则Stack将所有其他goroutine的堆栈跟踪格式化为buf,在当前goroutine的堆栈跟踪之后。
如果使用调试信息进行编译,则这将包含源代码中的行号

fafcakar

fafcakar4#

//import ( "log" "strings" "bytes" "path/filepath" )
func SRC_FILE() string {
    var buf bytes.Buffer
    log.New(&buf, "", log.Lshortfile).Output(2, "")//2=>CALLER 
    __FILE_LINE__ := strings.TrimSpace(buf.String())
    __FILE__ := strings.TrimRight(__FILE_LINE__, ":1234567890")
    return __FILE__
}

func SRC_DIR() string {
    var buf bytes.Buffer
    log.New(&buf, "", log.Llongfile).Output(2, "")//2=>CALLER
    __FILE_LINE__ := strings.TrimSpace(buf.String())
    __FILE__ := strings.TrimRight(__FILE_LINE__, ":1234567890")
    __DIR__ := filepath.Dir(__FILE__)
    return __DIR__
}

func main() {
    fmt.Println(SRC_FILE())//analogous to __FILE__
    fmt.Println(SRC_DIR()) //analogous to __DIR__
}

https://go.dev/play/p/3nvgknX96RO
go.dev/play上运行时,代码将作为prog.go运行

相关问题