go琐碎知识点
Defer
1、如果函数里面有多条defer指令,他们的执行顺序是反序,即后定义的defer先执行。
2、defer函数的参数是在defer语句出现的位置做计算的,而不是在函数运行的时候做计算的,即所在函数结束的时候计算的。
3、在defer语句里使用多条语句可以使用匿名函数
defer函数的参数在defer语句出现的位置计算,不是在defer函数运行的时刻计算;
4、defer函数会影响宿主函数的返回值
package main
import "log"
func foo1(i *int) int {
*i += 100
defer func() { *i += 200 }()
log.Printf("i=%d", *i)
return *i
}
func foo2(i *int) (r int) {
*i += 100
defer func() { r += 200 }()
log.Printf("i=%d", *i)
return *i
}
func foo3(i int) int {
i += 100
defer func() { i += 200 }()
log.Printf("i=%d", i)
return i
}
func main() {
var i, r int
i, r = 0, 0
r = foo1(&i)
log.Printf("i=%d, r=%d\n", i, r)
i, r = 0, 0
r = foo2(&i)
log.Printf("i=%d, r=%d\n", i, r)
i,r = 0,0
r = foo3(i)
log.Printf("i=%d, r=%d\n", i, r)
}
2021/01/05 17:41:06 i=100 //foo1 defer打印
2021/01/05 17:41:07 i=300, r=100 //foo1 main打印
2021/01/05 17:41:07 i=100 //foo2 defer打印
2021/01/05 17:41:07 i=100, r=300 //foo2 main打印
2021/01/05 17:41:07 i=100 //foo3 defer打印
2021/01/05 17:41:07 i=0, r=100 //foo3 main打印
查看4道真题和解析