面试题答案
一键面试- 输出结果:
输出结果为:
3 3 3
- 原因:
在Go语言中,
for
循环中的i
是一个变量,而不是每次迭代都创建一个新的变量。在闭包中,fmt.Println(i)
引用的是同一个i
变量。当for
循环结束后,i
的值为3
。所以当调用闭包函数时,打印的都是循环结束后i
最终的值3
。 - 修改代码实现预期输出:
方法一:使用一个新的变量捕获
i
的值
方法二:将package main import ( "fmt" ) func main() { var funcs []func() for i := 0; i < 3; i++ { j := i funcs = append(funcs, func() { fmt.Println(j) }) } for _, f := range funcs { f() } }
i
作为参数传递给闭包函数package main import ( "fmt" ) func main() { var funcs []func() for i := 0; i < 3; i++ { funcs = append(funcs, func(n int) func() { return func() { fmt.Println(n) } }(i)) } for _, f := range funcs { f() } }