当前位置: 首页 > 面试题库 >

获取返回函数的行号

赵永新
2023-03-14
问题内容

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

例:

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,不可能自动获取执行最后一次返回的行。

但是,有了一个小帮手,您可以拥有:

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>


 类似资料:
  • 问题内容: 我已经使用过返回一定数量的行。我的代码是这样的: 有没有什么方法可以检查返回的行数?还是我必须自己写? 问题答案: 您可以使用循环而不是循环,以便在执行循环后调用该循环,如下所示: 或自己计算行数:

  • 问题内容: 我试图创建一个可以异步运行多个进程并发送响应的函数。由于不返回响应,因此我想创建一个函数为: 在此函数中,我异步调用,它接受的其他参数。由于列表是作为参考传递的,所以我认为我可以在列表中附加实际功能的响应。和将返回我所有的功能的响应。 但这并不符合我的预期。值会附加到中的,但工作人员列表外部仍为空。 知道我在做什么错吗?而且,有没有其他选择可以实现我的目标? 问题答案: 您不能直接在流

  • 问题内容: 我正在编写Go程序。从这个Go程序中,我想调用另一个文件中定义的Python函数并接收该函数的返回值,以便可以在Go程序的后续处理中使用它。我在将所有返回的数据恢复到我的Go程序时遇到了麻烦。以下是我认为可行的最低示例,但显然无效: gofile.go pythonfile.py 如果我打电话,我得到以下输出: 一些注意事项: 我在Python调用中使用该标志,因此可以直接调用该函数。

  • 我觉得需要获取任何具有“record”返回数据类型的函数返回的表的列名和数据类型,因为。。。 现有基于SQL Server的系统中的一个关键进程使用一个存储过程,该存储过程将用户定义的函数作为参数。初始步骤获取作为参数传递的函数返回的表的列名和类型。 在Postgres 13中,我可以使用pg_proc.prorettype和相应的pg_type来查找返回记录类型的函数...这是一个开始。我也可以

  • 函数作为返回值 高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回。 我们来实现一个可变参数的求和。通常情况下,求和的函数是这样定义的: def calc_sum(*args): ax = 0 for n in args: ax = ax + n return ax 但是,如果不需要立刻求和,而是在后面的代码中,根据需要再计算怎么办?可以不返回