Golang匿名函数参数的作用

488 阅读1分钟

通过上一篇文章: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的函数返回