通过上一篇文章:Golang的defer预计算参数
其中有一个例子:
package main
import (
"fmt"
)
func main() {
i := 1
defer func() {
fmt.Println(test(i))
}()
i = 100
}
func test(i int) int {
i = i + 1
return i
}
结果:
D:\workspace\go\src\test>go run main.go
101
通过这个例子我们知道,最后运行defer的时候i是100,那如果我们在运行defer的时候就需要i是最初值1来做逻辑呢,那应该怎么办,很简单,把i当作匿名函数的参数。代码如下:
package main
import (
"fmt"
)
func main() {
i := 1
defer func(i int) {
fmt.Println(test(i))
}(i)
i = 100
}
func test(i int) int {
i = i + 1
return i
}
结果:
D:\workspace\go\src\test>go run main.go
2
原理和之前一样:当代码运行到defer func(i int) { fmt.Println(test(i)) }(i)的时候,会把defer右边最外层函数的参数计算完毕,并传递进函数里【就是例子(i int) i=1这个参数先固定了】,但不会执行函数体的代码直到包裹defer的函数返回