如果你使用的是log包,你可以命令日志记录器在条目前面加上各种信息。你可能对Lshortfile常量最感兴趣,它会产生d.go:23这样的前缀。或者,Llongfile可以打印文件的完整路径(比如/a/b/c/d.go:23)。 如果你不想使用log包,你也可以使用runtime.Caller(),这是日志包内部使用的,它不像C宏那样直接,但是你可以把它隐藏在一个函数后面(并指定正确的调用深度),比如see how the log package is implemented(第140行)。
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
}
4条答案
按热度按时间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行)。r7knjye22#
(1)编写一个调用runtime.Caller()的简短函数
(2)在运行时,在任何您想要访问源代码文件和行号的地方调用该函数。
示例:
注意:将1传递给Caller(),以便它返回调用file_line()的行号,而不是调用runtime.Caller()的行号。
t3psigkw3#
请参阅
runtime
和runtime.debug
软件包,特别是Stack
、PrintStack
或Caller
functions。Stack将调用方goroutine的堆栈跟踪格式化为buf,并返回写入buf的字节数,如果全部为真,则Stack将所有其他goroutine的堆栈跟踪格式化为buf,在当前goroutine的堆栈跟踪之后。
如果使用调试信息进行编译,则这将包含源代码中的行号
fafcakar4#
https://go.dev/play/p/3nvgknX96RO
在
go.dev/play
上运行时,代码将作为prog.go
运行