Go语言示例 --19关于defer的使用

1. 关于Golang defer

defer是Golang的一个重要的关键字。defer在其所在的函数/方法运行结束时,才开始运行。

1.1. example 1: helloworld

例子一,defer在其所在的main函数执行结束时,才开始执行,如下,

package main
import "fmt"

func main() {
    defer fmt.Println("world")
    fmt.Println("hello")
}

运行结果,

hello
world

例子二,defer在其所在的main函数执行结束时,才开始执行,如下,

package main
import "fmt"

func main() {
    defer fmt.Println("world")
    panic("main stop here...")
    fmt.Println("hello")
}

运行结果,

world
panic: main stop here...

1.2. example 2: defer内部执行次序

通过前面的例子,知道defer在其所在的main函数执行结束时,才开始执行。

下面这个例子,要说明:defer在执行时,采用后来者先执行(last-in-first-out后来居上)的执行方式,如下,

package main
import "fmt"

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

运行结果,

3
2
1

1.3. example 3: defer的常见用于资源释放

下面例子,main执行完毕后,通过defer释放文件句柄,如下,

package main
import (
    "log"
    "os"
)

func main() {
    f, err := os.Open("data.txt")
    if err != nil{
        log.Printf("fail to open the file")
        return
    }
    defer f.Close()

    buffer := make([]byte, 4)
    nbytes, err := f.Read(buffer)
    log.Printf("%d bytes: %s\n", nbytes, string(buffer[:nbytes]))
}

运行结果,

4 bytes: data


参考资料

[1. defer的用法] https://yourbasic.org/golang/defer/


备注

[备注一] 初稿,2019年07月18号。

上一篇:go语言的defer语句


下一篇:JavaScript高级程序设计(第三版)_第二章 在HTML中使用JS