golang中defer执行时机与常见问题

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

defer是什么?

在Go语言中,可以使用关键字defer向函数注册退出调用,即主函数退出时,defer后的函数才被调用。defer语句的作用是不管程序是否出现异常,均在函数退出时自动执行相关代码。 

defer的用途

在函数中,程序员经常需要创建资源(比如:数据库连接、文件句柄、锁等) ,为了在函数执行完 毕后,及时的释放资源,Go 的设计者提供 defer (延时机制)。

defer的执行时机

了解defer的执行时机首先要知道golang的return并非原子操作,return的底层机制如下(例return x):

  1. 返回值 = x //返回值赋值
  2. 运行defer //执行defer代码
  3. RET指令 //执行返回操作

defer常见问题

func f1() int {
    x := 5
    defer func() {
        x++
    }()
    return x    //1.返回值=x=5;2.x++;
}
func f2() (x int) {
    defer func() {
        x++
    }()
    return 5    //1.x=5;2.x++
}
func f3() (y int)  {
    x := 5
    defer func() {
        x++
    }()
    return x    //1.y=x=5;2.defer x++
}
func f4() (x int)  {
    defer func(x int) {
        x++            //改变x副本
    }(x)                    //参数传递为x副本
    return 5             //1.x=5;2.defer
}
func f5() (x int)  {
    defer func(x *int) {
        *x++        //由于引用传值,所以x++
    }(&x)
    return 5      //1.x=5;2.defer x++
}
func main() {
    fmt.Println(f1())    //5
    fmt.Println(f2())    //6
    fmt.Println(f3())    //5
    fmt.Println(f4())    //5
    fmt.Println(f5())    //6
}

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

本文来自:简书

感谢作者:皮儿吃屁

查看原文:golang中defer执行时机与常见问题

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

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