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

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
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容