1. 多个defer语句,按先进后出的方式执行
package main
import "fmt"
func main() {
var whatever [5]struct{s}
for i := range whatever {
defer fmt.Println(i)
}
}
//4
//3
//2
//1
//0
2. 易错点:defer加func函数带return
package main
import "fmt"
//测试函数带参数 直接返回函数参数x再调用defer
func test1(x int) int {
defer func() { x = 9 }()
return x
}
//测试函数带参数 先赋值x 然后回回函数参数x再调用defer
func test11(x int) int {
defer func() { x = 9 }()
x = 10
return x
}
//测试函数返回值带参数 先赋值x 然后回回函数参数x再调用defer 但是defer内参数x与返回值参数名相同 直接覆盖原返回值
//结尾return x 是诱导 可以不用写返回值
func test2() (x int) {
defer func() { x = 9 }()
x = 10
return x
//return
}
//测试函数返回值带参数 同上 覆盖并调用defer得 返回值为10
func test3() (x int) {
defer func() { x = 10 }()
defer func() { x = 9 }()
return x
}
func main() {
fmt.Println(test1(1)) //1
fmt.Println(test11(1)) //10
fmt.Println(test2()) //9
fmt.Println(test3()) //10
}
总结: 执行逻辑
测试函数->非defer测试函数内局部变量赋值->return 变量 ->defer函数(如果测试函数有返回值函数且内部变量与返回值参数同名,覆盖return变量值)
更多defer用法参考: Go 延迟调用 defer 用法详解 - 腾讯云开发者社区-腾讯云 (tencent.com)