Go 语言defer用法

defer延迟调用:

1、确保调用在函数结束时发生;

2、defer列表为先进后出;

3、通常在Open/Close  Lock/Unlock中使用。

defer调用顺序示例:

package main

import (
    "fmt"
)

func deferType() {
    defer fmt.Println("defer 01")
    defer fmt.Println("defer 02")
    fmt.Println("hello defer")
    defer fmt.Println("defer 03")
    panic("hello panic")
    defer fmt.Println("defer 04")    // panic后的defer不会被执行
}


func main() {
    deferType()
}

输出结果:

hello defer
panic: hello panic
defer 03
defer 02
defer 01

goroutine 1 [running]:
main.deferType()
    /Users/shongbing/go/src/imooc/errhanding/defer/defer.go:15 +0x19b
main.main()
    /Users/shongbing/go/src/imooc/errhanding/defer/defer.go:35 +0x22

defer 关闭文件

package main

import (
    "os"
    "bufio"
    "fmt"
)

func Fibonacci() func() int {
    // 斐波那契数列,返回一个intGen类型
    a, b := 0, 1
    return func() int {
        a, b = b, a + b
        return a
    }
}

func writeFile(filename string) {
    file, err := os.Create(filename)
    if err != nil {
        panic(err)
    }
    defer file.Close()

    writer := bufio.NewWriter(file)
    defer writer.Flush()
    f := Fibonacci()
    for i:=0; i<20; i++ {
        fmt.Fprintln(writer, f())
    }
}

func main() {
    writeFile("fib.txt")
}
原文地址:https://www.cnblogs.com/vincenshen/p/9309829.html