defer - skynocover/Wiki-for-GoLang GitHub Wiki

defer

用來延遲執行,發生於return之後

用來釋放資源

f, _ := os.Open(filename)
defer f.Close()

可以不用去管return的位置,直接寫在file後面即可

接住panic

func main() {
    defer func() {
        if ok := recover(); ok != nil {
            fmt.Println("recover")
        }
    }()
    panic("error")
}

順序

計算順序

func a() {
    i := 0
    defer fmt.Println(i) //在這裡決定defer的值
    i++
    return
}
// 0

多個defer順序

defer func() { fmt.Println("1") }()
defer func() { fmt.Println("2") }()
defer func() { fmt.Println("3") }()

// 3 2 1

return後還是可以修改

func c() (i int) {
    defer func() { i++ }()
    return 1
}
// 2