Go语言中defer函数的参数值及执行时机

2023-06-01 00:00:00 函数 执行 时机

1.defer函数参数值

对defer延迟执行的函数,它的参数会在声明时候就会求出具体值,而不是在执行时才求值:

// 在 defer 函数中参数会提前求值

func main() {

    var i = 1
   
    defer fmt.Println("result: ", func() int { return i * 2 }())
   
    i++
}


结果:

result: 2



2.defer函数执行时机

对 defer 延迟执行的函数,会在调用它的函数结束时执行,而不是在调用它的语句块结束时执行,注意区分开。


比如在一个长时间执行的函数里,内部 for 循环中使用 defer 来清理每次迭代产生的资源调用,就需要将 defer 放到一个匿名函数中才不会有问题


// 目录遍历正常

func main() {

    // ...
   
    for _, target := range targets {
   
        func() {
       
            f, err := os.Open(target)
           
            if err != nil {
           
                fmt.Println("bad target:", target, "error:", err)
               
                return    // 在匿名函数内使用 return 代替 break 即可
               
            }
           
            defer f.Close()    // 匿名函数执行结束,调用关闭文件资源
           
            // 使用 f 资源
           
        }()
    }
}



更多go语言的注意点,请收藏本站网址:https://www.zongscan.com/



相关文章