gpt4 book ai didi

go - 获取函数返回的行号

转载 作者:IT王子 更新时间:2023-10-29 01:26:11 25 4
gpt4 key购买 nike

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

例子:

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 处理程序,我想记录返回错误的行和文件名,而不必乱写代码。

最佳答案

AFAIK,无法自动获取执行最后一次返回的行。

但是,有了一个小 helper ,您就可以拥有:

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))
}

Playground


输出:

/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>

关于go - 获取函数返回的行号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17543546/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com