【Go】defer和os.Exit()
点击阅读更多查看文章内容
特性
延迟执行:
defer语句会将函数调用压入一个栈中,在当前函数返回之前按照 后进先出(LIFO) 的顺序执行。参数预计算:
defer语句中的函数参数会在defer语句执行时立即计算,而不是在延迟调用时计算。1
2
3
4
5
6
7
8func main() {
i := 1
defer fmt.Println("Deferred call:", i)
i++
fmt.Println("Main function:", i)
}
// Main function: 2
// Deferred call: 1作用域:
defer语句的作用域是当前函数,函数返回时才会执行defer语句。如果函数中有多个
defer语句,它们会按照 后进先出(LIFO) 的顺序执行。panic后的defer不会被执行,panic之前的defer会被执行(遇到panic,如果没有捕获错误,函数会立刻终止)
panic没有被recover时,抛出的panic到当前goroutine最上层函数时,最上层程序直接异常终止
defer、return、返回值三者的执行逻辑应该是:return最先执行,return负责将结果写入返回值中;接着defer开始执行一些收尾工作;最后函数携带当前返回值退出
1
2
3
4
5
6
7
8
9
10
11
12func testd() int {
i := 1
defer func() {
i++
}()
return i
}
func main() {
fmt.Println(testd())
}
// 1
defer和os.Exit
问题:在使用os.Exit退出后,defer func() {…}()没有执行

原因:os.Exit函数描述如上,不会执行deferred functions
defer func 与 defer 的参数计算时间
1 | func test() { |
执行结果:
t2是声明defer的时间,go会在注册时立即获取time.now的值
t1是返回的时间,函数会在实际执行时才求值
1 | t2: 2025-04-16 17:28:36.905449 +0800 CST m=+0.000054460 |
【Go】defer和os.Exit()
https://shnpd.github.io/2025/03/03/gonote/【Go】defer和os.Exit()/

