gpt4 book ai didi

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

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

我想知道 golang 函数退出时的返回值。 golang 的 defer 机制很有用,但它在注册 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确实在这方面走了很长一段路,但没有打印返回值。

最佳答案

您认为延迟函数的参数是在延迟排队时计算的,而不是在执行时计算的,这是正确的。

您创建引用命名返回值的匿名函数的方法是有效的。另一种方法是传入返回值的地址:

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,那并不难。

关于function - 你如何在golang中记录函数调用返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29871585/

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