伪代码:
defer fmt.Printf("aaaaaa ")
defer fmt.Printf("bbbbbb ")
test(0)
defer fmt.Printf("ccccccc ")
ps:test是一个错误的函数
运行结果:
bbbbbbb
aaaaaaa
defer是一个压栈操作,在函数执行结束时运行 因为test()的时候就已经崩了 所以CCCC没有压栈自然就无法打印
伪代码:
defer fmt.Printf("aaaaaa ")
defer fmt.Printf("bbbbbb ")
defer test(0)
defer fmt.Printf("ccccccc ")
运行结果:
ccccccccc
bbbbb
aaaaa
defer的特性就是无论程序是否出错都会执行
func main(){
a,d : = 10,20
defer func (a int,b int){
fmt.Printf("%d %d ",a,b)
}(a,b)
a+=100
b+=100
}
运行结果:
10 20
这就是匿名函数传参调用和 捕获调用的区别了 在defer压栈的时候就已经相当于值传递进去了
如果是捕获调用的话输出结果就是
110 120