 |
|
2
defia Oct 29, 2014 1
后面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; }
|