如何在golang中记录函数调用返回值

时间:2015-04-25 22:47:53

标签: function reflection go trace

我想知道退出golang函数时的返回值。 golang延迟机制很有用,但它会在defer语句注册时而不是在执行时评估参数。我可以使用匿名函数来处理返回值:

func try() (int i) {
  defer func() {fmt.Printf("%d", i)}()
  i = 10
  return i+1
}

func main() {
  try()
}

我认为这可以正常工作,但我想以通用的方式处理这个问题,或许类似于:

func try(in string) (out int) {
  enter("%s", in);exit("%d", out)
}

或者更好的是,使用反射在进入/退出时输出参数/返回值。我假设运行时性能并不重要:)。

这样做有好办法吗? Shaba Abhiram's handy Tracey lib确实对此有很大帮助,但没有打印返回值。

2 个答案:

答案 0 :(得分:3)

正确评估延迟函数的参数是在延迟排队时评估的,而不是在执行时评估。

制作引用命名返回的匿名函数的方法是有效的。另一种方法是传递返回值的地址

func try() (i int) {
    defer printReturns(time.Now(), &i)
    time.Sleep(10 * time.Millisecond)
    i = 10
    return i + 1
}

func printReturns(start time.Time, rets ...interface{}) {
    fmt.Println(time.Now().Sub(start))
    for _,ret := range rets{
        fmt.Println(ret)
    }
}

这种方法的问题是你的日志记录功能现在有一个指针而不是真实的类型,必须解开指针以对它们做任何事情。但是如果你使用reflect,这并不是非常困难。

答案 1 :(得分:2)

在没有添加大量printf的情况下,您最接近的方法是使用godebug,这几乎为您添加了printfs