目录
1. defer是LIFO,类似堆栈方式运行的
示例
func test(){
defer fmt.Println(1)
defer fmt.Println(2)
defer fmt.Println(3)
return
}
运行结果
3
2
1
2. return与defer同时出现时,defer只有被return包裹才会运行
func test2(){
defer fmt.Println(1)
defer fmt.Println(2)
if true {
return
}
defer fmt.Println(3)
return
}
运行结果
2
1
3. return变量时,并不是原子操作,分为赋值 + 返回,如果有defer将在赋值与返回间执行
匿名返回值
func test3() int {
var i int
defer i++
return i
}
//等价
//func test3() int {
// var i int
// ret:=i
// defer i++
// return ret
//}
运行结果
0
有名返回值
func test4() (i int) {
defer i++
return i
}
//等价
//func test4() (i int) {
// defer i++
// return i
//}
运行结果
1
有名返回值临时赋值
func test3() (i int) {
var temp int
defer temp++
return temp
}
//等价
//func test3() (i int) {
// i=temp
// defer temp++
// return i
//}
运行结果
0
参考
https://studygolang.com/articles/14159
本文详细解析了Go语言中defer语句的工作原理,包括其LIFO执行特性、与return语句的交互方式,以及在返回变量过程中的具体行为。通过具体示例,展示了defer在不同场景下的执行顺序,帮助读者掌握这一重要的并发控制工具。

被折叠的 条评论
为什么被折叠?



