go语言入门
defer
延迟执行一条语句,当一个程序被正常执行并退出前一刻或者异常退出前一刻。
不能执行内建函数和unsafe类的函数
有点像java中的finaly
内建函数
执行顺序
当一个函数中存在多个defer语句时,它们携带的表达式语句的执行顺序一定是它们的出现顺序的倒序
使用defer作用域外变量的注意事项
变量作用域问题
defer是在程序执行完退出前执行的,因此拿到的变量是最终的状态
func deferIt() {
fmt.Println()
for i := 0; i < 5; i++ {
defer fmt.Print(i)
}
}
// 5
// 5
// 5
// 5
// 5
怎么解决
/**
会把参数保存到栈上
*/
func deferIt3() {
for i := 0; i < 5; i++ {
defer func(n int) {
fmt.Println(n)
}(i)
}
}
问题:defer后的语句中的参数列表是会马上执行的
这是一个需要注意的点
f := func(i int) int {
fmt.Print(i)
return i * 10
}
for i := 0; i < 5; i++ {
defer fmt.Printf("%d\n", f(i))
}