go defer

go defer使用
defer用途:
1. 关闭文件句柄
2. 锁资源释放
3. 数据库连接释放
特性:
1. 关键字 defer 用于注册延迟调用。
2. 这些调用直到 return 前才被执。因此,可以用来做资源清理。
3. 多个defer语句,按先进后出的方式执行。
4. defer语句中的变量,在defer声明时就决定了。

package main

import "fmt"

func main() {
    var users [5]struct{}
    for i := range users {
        defer fmt.Println(i)
    }
}

输出:4 3 2 1 0 ,defer 是先进后出

package main
import "fmt"

func main() {
    var users [5]struct{}
    for i := range users {
        defer func() { fmt.Println(i) }()
    }
}

输出:4 4 4 4 4
官网对defer 闭包的使用大致是这个意思:
函数正常执行,由于闭包用到的变量i在执行的时候已经变成4,所以输出全都是4

换成函数:

package main
import "fmt"

func main() {
    var users [5]struct{}
    for i := range users {
        defer Print(i)
    }
}
func Print(i int) {
    fmt.Println(i)
}

函数正常延迟输出:4 3 2 1 0

 参考https://www.cnblogs.com/phpper/p/11984161.html

posted @ 2021-02-24 13:57  牧 天  阅读(97)  评论(0)    收藏  举报