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打印