0%
defer关键词规则
- 规则一:延迟函数的参数在defer语句出现时就已经确定下来了(因为会有拷贝)
- 规则二:延迟函数执行按后进先出顺序执行,即先出现的defer最后执行(filo,栈操作)
- 规则三:延迟函数可能操作主函数的”具名”返回值
- 对于指针类型参数,规则仍然适用,只不过延迟函数的参数是一个地址值,
- 这种情况下,defer后面的语句对变量的修改可能会影响延迟函数。
示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| func variableDemo1() { for i := 1; i <= 5; i++ { defer func(t int) { fmt.Printf("t = %d \n", t) }(i)
defer func() { fmt.Printf("t2 = %d \n", i) }() } }
func returnVariableDemo1() (t int) { defer func() { t++ }() return 2 }
func returnVariableDemo2() int { t := 2 defer func() { t++ }() return t }
func variableDemo2() (t int) { defer func(i int) { fmt.Println("variableDemo2 i = ", i) fmt.Println("variableDemo2 t = ", t) }(t) t = 1 return 2 }
|