go语言defer的学习

伪代码:

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

原文地址:https://www.cnblogs.com/JS1990499200/p/13441590.html