美文网首页
golang中defer执行时机与常见问题

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

作者: 皮儿吃屁 | 来源:发表于2020-11-28 23:05 被阅读0次

    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执行时机与常见问题

          本文链接:https://www.haomeiwen.com/subject/gkgqwktx.html