其中有一个例子:

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)