golang中的defer

A defer statement is often used with paired operations like open and close, connect and disconnect, or lock and unlock to ensure that resources are released in all cases, no matter how complex the control flow. The right place for a defer statement that releases a resource is immediately after the resource has been successfully acquired.

在golang当中,defer代码块会在函数调用链表中增加一个函数调用。这个函数调用不是普通的函数调用,而是会在函数正常返回,也就是return之后添加一个函数调用。因此,defer通常用来释放函数内部变量。

func ReadWrite() bool {

    file.Open("file")

    defer file.Close()   //file.Close() is added to defer list

    // Do your thing

    if failureX {

    return false   // Close() is now done automatically

    }

    if failureY {

    return false   // And here too

    }

    return true   // And here

    }

Deferred functions are executed in LIFO order, so the below code prints: 4 3 2 1 0.

package main

import "fmt"

func main() {

    for i := 0; i < 5; i++ {

        defer fmt.Printf("%d ", i)

    }

}

defer、return、返回值三者的执行逻辑应该是:return最先执行,return负责将结果写入返回值中;接着defer开始执行一些收尾工作;最后函数携带当前返回值退出。

注意下面两个例子

golang中的defer_第1张图片

这是无名返回值的情况(上图)

golang中的defer_第2张图片

这是有名返回值的情况(上图)

a()int 函数的返回值没有被提前声明,其值来自于其他变量的赋值,而defer中修改的也是其他变量,而非返回值本身,因此函数退出时返回值并没有被改变。 
b()(i int) 函数的返回值被提前声明,也就意味着defer中是可以调用到真实返回值的,因此defer在return赋值返回值 i 之后,再一次地修改了 i 的值,最终函数退出后的返回值才会是defer修改过的值。

你可能感兴趣的:(go)