• defer用于注册延迟调用, 在外围函数return之前调用
  • 使用多个defer的话,这些defer按照注册时的FILO的顺序执行(可以想象成栈)
  • 多个defer依次执行,即使中间有panic. panic会在外围函数结束时捕获,向外扩散
  • defer的参数在注册时求值和复制
package main

import "fmt"

func main() {
    i := 10;
    defer fmt.Println(i)
    i = i + 1
    fmt.Println(i)
}

输出为

11
10

另一个例子

package main

import "fmt"

func end(line string) {
    fmt.Printf("%s\n", line)
}

func main() {
    line := "first"
    defer end(line)
    line = "second"
    fmt.Printf("%s\n", line)
}

输出为

  second
  first
  • 用指针和闭包可以避免上面的情况,达到延迟读取的效果
package main

import "fmt"

func main() {
    line := "first"
    defer func() {
        fmt.Printf("%s\n", line)
    }()
    line = "second"
    fmt.Printf("%s\n", line)
}

输出为

second
second
本文地址 Go中的defer 转载请注明出处