Golang延时执行defer

defer概述 defer xxx() 延时执行,将xxx放在函数的最后执行 多个defer xxx()时,所有defer倒序执行,即最早声明
的defer会最后执行

用途

  • (数据库读写,文件读写,网络数据读写)
  • 资源=数据库连接,打开的文件对象,网路连接
  • 资源开销(CPU,内存,磁盘…)巨大
  • 资源,随用随开,用完【即】关



场景

  • O只是场景之一

  • 其它场景:消费完毕要买单,运动完要洗澡,自习结束要关灯…




读写数据库,并在程序的最后关闭数据库

1
2
3
4
5
6
7
8
func demo41() {
//随用随开,用完【即】关
fmt.Println("打开数据库")
//defer所唤起的函数将在函数结束前才执行
defer closeDatabase()
fmt.Println("愉快地读写数据")
fmt.Println("读写完毕")
}



多个defer时,最早defer的操作最后执行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
func demo42() {
//打开数据库
fmt.Println("打开数据库")
defer closeDatabase()
//读入DB数据
fmt.Println("读入DB数据")
//打开文件
fmt.Println("打开文件")
defer closeFile()
//向文件中写出DB中的数据
fmt.Println("读入DB数据")
//关闭文件
//继续操作数据库
fmt.Println("继续操作数据库")
//关闭数据库
}
func closeDatabase() {
fmt.Println("关闭数据库")
}
func closeFile() {
fmt.Println("关闭文件")
}


其他defer案例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
package main

import "fmt"

func xingzuoZhensuo() {
var birthday string
fmt.Println("请输入您的生日,例如0823")
fmt.Scan(&birthday)

if birthday >= "0823" && birthday <= "0922" {
fmt.Println("阁下真乃神人也")
} else if birthday >= "0923" && birthday <= "1022" {
fmt.Println("阁下是天秤座")
} else if birthday >= "1023" && birthday <= "1122" {
fmt.Println("阁下是天蝎座")
} else if birthday >= "1123" && birthday <= "1222" {
fmt.Println("阁下是射手座")
} else if (birthday >= "1223" && birthday <= "1231") || (birthday >= "0101" && birthday <= "0122") {
fmt.Println("阁下是摩羯座")
} else if birthday >= "0123" && birthday <= "0222" {
fmt.Println("阁下是水瓶座")
} else if (birthday >= "0223" && birthday <= "0229") || (birthday >= "0301" && birthday <= "0322") {
fmt.Println("阁下是双鱼座")
} else if birthday >= "0323" && birthday <= "0422" {
fmt.Println("阁下是白羊座")
} else if birthday >= "0423" && birthday <= "0522" {
fmt.Println("阁下是金牛座")
} else if birthday >= "0523" && birthday <= "0622" {
fmt.Println("阁下是双子座")
} else if birthday >= "0623" && birthday <= "0722" {
fmt.Println("阁下是巨蟹座")
} else if birthday >= "0723" && birthday <= "0822" {
fmt.Println("阁下是狮子座")
} else {
fmt.Println("阁下就是传说中的蛇夫座鸭!")
}

}

func main071() {
fmt.Println("亲爱的患者,欢迎来到我院!")
//挂起一个延时任务(在当前函数返回(结束)前执行)
defer fmt.Println("同志再见,我院永远欢迎你!")

xingzuoZhensuo()
fmt.Println("事务A")
fmt.Println("事务B")
fmt.Println("事务C")
}

/*
·诊断完毕后连续输出“您的诊断已结束”,“请这边滚”,“我院永远欢迎你”
*/
func main() {
fmt.Println("亲爱的患者,欢迎来到我院!")

/*多个defer时,执行顺序是倒置的*/
//第1个defer会倒数第1个执行
defer fmt.Println("我院永远欢迎你")
//第2个defer会倒数第2个执行
defer fmt.Println("请这边滚")
//第3个defer会倒数第3个执行
defer fmt.Println("您的诊断已结束")

xingzuoZhensuo()
fmt.Println("事务A")
fmt.Println("事务B")
fmt.Println("事务C")
}