厚土Go学习笔记 | 15. defer语句延迟函数的执行

时间:2022-05-06
本文章向大家介绍厚土Go学习笔记 | 15. defer语句延迟函数的执行,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

当函数中有defer语句,会延迟此语句的执行,直到函数返回后才执行。

defer fmt.Println("")

defer后面的是参数

延迟调用的参数是立刻生成的,但是在上层函数返回前都不会去执行。

看例子,并运行看结果

package main

import "fmt"

func main() {
    defer fmt.Print("Hello")
    fmt.Print("World")
}

你认为执行结果是什么呢?肯定不是HelloWorld,而是

WorldHello

延迟的函数调用是被压入一个栈中。当函数返回时,会按照后进先出的原则,调出被延迟的函数调用。请看下面例子中,i的打印顺序。

package main

import (
    "fmt"
)

func main() {
    fmt.Println("Begin...")
    for i := 0; i < 10; i++{
        defer fmt.Println(i)
    }
    fmt.Println("Done")
}

运行结果

Begin...
Done
9
8
7
6
5
4
3
2
1
0

看明白了么?

整个函数的输出已经运行完了,打印了 Done ,然后才开始打印 for 循环的 defer,并且是后进先出的方式,是从 i = 9 开始打印的。