是否可以获取从调用范围返回函数的行号?
示例:
func callee() error {
if cond {
return errors.New("whoops!")
}
return nil
}
func caller() {
// Possible to retrieve the line number of callee return here?
callee()
}
我认为这是不可能的,因为它应该已经从堆栈中删除了,但它可能仍在某处缓存?
用例是我有一个HTTP处理程序,我想记录返回错误的行和文件名,而不必乱丢代码。
答案 0 :(得分:7)
AFAIK,无法自动获取执行最后一次返回的行。
但是,如果有一个小助手可以:
package main
import (
"fmt"
"runtime"
)
func here(s string, args ...interface{}) error {
_, fname, fline, _ := runtime.Caller(1)
h := fmt.Sprintf("%s:%d: ", fname, fline)
return fmt.Errorf(h+s, args...)
}
func foo(i int) error {
if i == 2 {
return here("cannot handle %d", i) // line 16
}
if i%3 == 0 {
return here("also cannot handle %d", i) // line 20
}
return nil
}
func main() {
fmt.Println(foo(2))
fmt.Println(foo(3))
fmt.Println(foo(4))
}
输出:
/tmpfs/gosandbox-92c2a0f2_32bdf9d9_3c7d2a0a_80ba8510_f68d9721/prog.go:16: cannot handle 2
/tmpfs/gosandbox-92c2a0f2_32bdf9d9_3c7d2a0a_80ba8510_f68d9721/prog.go:20: also cannot handle 3
<nil>