在 Go 中获取报错行号的方法是使用内置的 runtime
包中的 Caller
函数。该函数接受一个整数参数来表示跳过调用栈中前面几个函数,然后返回当前位置的文件名、行号和函数名信息。
以下是一个示例代码:
package main
import (
"fmt"
"runtime"
)
func main() {
err := someFunc()
if err != nil {
fmt.Printf("Error occurred at %s:%d\n", getFileLine(err))
}
}
func someFunc() error {
return fmt.Errorf("an error occurred")
}
func getFileLine(err error) (string, int) {
pc, file, line, ok := runtime.Caller(1)
if !ok {
return "unknown", 0
}
return file, line
}
在上面的代码中,我们首先定义了一个 someFunc()
函数,它会返回一个错误。然后在主函数中调用该函数,并检查是否有错误发生。如果有错误,则调用 getFileLine()
函数来获取错误发生的文件名和行号。
在 getFileLine()
函数中,我们使用 Caller(1)
来获取当前位置信息。注意,这里传递了整数值 1 表示跳过第一层调用(即该函数本身),从而获取更具体的位置信息。
最后,在主函数中打印出错误发生的位置信息。运行该程序可以得到如下输出:
Error occurred at /path/to/file.go:12
其中 /path/to/file.go
是发生错误的文件路径,12 是发生错误的行号。