获取返回函数的行号

Eri*_*ner 5 go

是否可以获取从调用范围返回函数的行号?

例:

func callee() error {
  if cond {
    return errors.New("whoops!")
  }
  return nil
}

func caller() {
  // Possible to retrieve the line number of callee return here?
  callee()
}
Run Code Online (Sandbox Code Playgroud)

我认为这是不可能的,因为它应该已经从堆栈中删除,但也许它仍然在某处缓存?

用例是我有一个HTTP处理程序,我想记录返回错误的行和文件名,而不必乱丢代码.

zzz*_*zzz 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))
}
Run Code Online (Sandbox Code Playgroud)

操场


输出:

/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>
Run Code Online (Sandbox Code Playgroud)