golang中defer的关键特性示例详解

2020-01-28 12:20:44王冬梅


defer func() { fmt.Println("1") }()
defer func() { fmt.Println("2") }()
defer func() { fmt.Println("3") }()

输出顺序是 321。

这个特性可以对一个 array 实现逆序操作。

五、被 deferred 函数的参数在 defer 时确定

这是 defer 的特点,一个函数被 defer 时,它的参数在 defer 时进行计算确定,即使 defer 之后参数发生修改,对已经 defer 的函数没有影响,什么意思?看例子:


func a() {
 i := 0
 defer fmt.Println(i)
 i++
 return
}

a 执行输出的是 0 而不是 1,因为 defer 时,i 的值是 0,此时被 defer 的函数参数已经进行执行计算并确定了。

再看一个例子:


func calc(index string, a, b int) int {
 ret := a + b
 fmt.Println(index, a, b, ret)
 return ret
}
func main() {
 a := 1
 b := 2
 defer calc("1", a, calc("10", a, b))
 a = 0
 return
}

执行代码输出


10 1 2 3 
1 1 3 4

defer 函数的参数 第三个参数在 defer 时就已经计算完成并确定,第二个参数 a 也是如此,无论之后 a 变量是否修改都不影响。

六、被 defer 的函数可以读取和修改带名称的返回值


func c() (i int) {
 defer func() { i++ }()
 return 1
}

被 defer 的函数是在 return 之后执行,可以修改带名称的返回值,上面的函数 c 返回的是 2。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对易采站长站的支持。

参考资料

https://blog.golang.org/defer-panic-and-recover