defia
2014-10-29 16:48:47 +08:00
后面range得到的f,是一个值,其类型为函数,同一个函数所以为同一个指针
f()即函数返回值
至于为什么3个返回值都是3,我们来分析一下函数本身:
func() int {
return i
}
这个函数为一个返回int的函数
返回的数值为i
在这里,i是闭包,记住一点,通过闭包获取的函数作用域之外(这里为函数内部引用外部)的外部变量,类似于指针,即在闭包内部作用域引用外部变量时,并非像传参一样复制外部的变量数值,而是保留了外部变量的引用,所以在内部使用外部变量时,该数值取决于执行时该外部变量的值
在执行f()的时候,上面的for循环已经结束,i的数值为3,所以最终3个结果都是3
同样的再来个例子:
func main() {
values := []string{"a", "b", "c"}
for _, v := range values {
go func() {
fmt.Println(v) //通过闭包传递了v的引用
}()
}
var input string
fmt.Scanln(&input)
fmt.Println("done")
}
该例子中,最终结果输出是3个"c",而非abc
因为在runtime.GOMAXPROCS()==1的情况下,3个goroutine的执行发生于阻塞时,即fmt.Scanln时,在这个时候循环已经结束,v=="c"
这点类似javascript
for(var i=0;i<5;i++){
var j=1;
setTimeout(function(){
console.log(i+' '+j)
},200);
j=2;
}