【Go】defer

defer

defer

defer 语句会将函数推迟到外层函数返回之后执行

推迟调用的函数其参数会理解求职,但直到外层函数返回前该函数都不会调用

1
2
3
4
5
6
7
8
9
10
11
12
13
package main

import "fmt"

func main() {
var count int = 0

defer fmt.Printf("world: %d\n", count)

count += 1

fmt.Printf("Hello: %d\n", count)
}

保存为 helloworld.go, 执行结果:

1
2
3
[me@VM_0_14_centos go]# go run helloworld.go 
Hello: 1
world: 0

1、先打印 Hello, 然后打印 world, 说明defer后面的语句被推迟执行了

2、Hello后面是 1, 因为 count += 1, count 已经为 1了
world后面是 0, 虽然 打印world延后执行,但是 打印语句内的表达式 提前执行了

defer栈

defer推迟执行的函数调用都会被压入到一个栈中

栈符合后进先出的预期,当外层函数返回时,栈中的函数后进先出顺序调用

1
2
3
4
5
6
7
8
9
10
11
12
13
package main

import "fmt"

func main() {
fmt.Println("Counting")

for i := 0; i < 5; i++ {
defer fmt.Println(i)
}

fmt.Println("over")
}

保存 helloworld.go, 执行结果如下

1
2
3
4
5
6
7
8
[me@VM_0_14_centos go]# go run helloworld.go 
Counting
over
4
3
2
1
0
坚持原创技术分享,谢谢鼓励我继续创作!