golang defer

舒小贱 · · 567 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

The arguments to the deferred function (which include the receiver if the function is a method) are evaluated when the defer executes, not when the call executes
原文

被defer的方法的参数,是在defer声明的时候就准备好的。如果方法带receiver,则receiver也是在defer声明的时候就准备好的。
例1:

for i := 0; i < 5; i++ {
    defer fmt.Printf("%d ", i)
}

output:
4
3
2
1
0

例2:

func trace(s string) string {
    fmt.Println("entering:", s)
    return s
}

func un(s string) {
    fmt.Println("leaving:", s)
}

func a() {
    defer un(trace("a"))
    fmt.Println("in a")
}

func b() {
    defer un(trace("b"))
    fmt.Println("in b")
    a()
}

func main() {
    b()
}

output:
entering: b
in b
entering: a
in a
leaving: a
leaving: b

当声明defer un(trace("b"))的时候,会先把defer un这个方法的参数准备好,也即会执行trace("b")来给被defer的un方法提供参数,所以我们看到entering: b最先打印。

effective_go对此的解释:
it's not block-based but function-based


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:舒小贱

查看原文:golang defer

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

567 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传