2 回答
TA贡献1852条经验 获得超1个赞
延迟函数作为函数中的最后一件事运行,在 return 语句之后,所以annotate函数将首先运行next,只有在返回之后,延迟函数才会运行。根据您的代码,它应该打印的顺序是:
first pre
second pre
third pre
my endpoint
third post
second post
first post
TA贡献2037条经验 获得超6个赞
请注意,如果您在给定函数中defer 多次调用,则每个延迟调用都按 LIFO 顺序运行。因此,如果您想使用defer确保您post首先被调用,然后是next操作,请考虑替换:
defer fmt.Println(s, "post")
next(ctx, request)
和:
defer next(ctx, request)
defer fmt.Println(s, "post)
当然,在您的情况下,您想返回什么next返回,这会产生一个小问题。要在实际情况下解决这个问题,您需要一个小函数和一些命名的返回值:
defer func() { i, e = next(ctx, request) }()
其中i和e是命名的返回值。
这是相同的代码变成了一个新示例,其中延迟调用以所需的顺序发生。 在这种情况下,这个例子是相当愚蠢的,因为没有任何恐慌,也没有中间的“危险步骤”,所以我们真正需要的是fmt.Println
按顺序执行这两个调用,而不使用defer
. 但是,如果我们可以在the和 post 部分之间感到恐慌fmt.Println(s, "pre")
,那么这可能是有道理的。
- 2 回答
- 0 关注
- 94 浏览
添加回答
举报