http://golang-basic.blogspot.tw/2014/06/golang-closures-running-as-go-routines.html
程式 1,輸出 : c, c, c
package main import ( "fmt" ) func main() { done := make(chan bool) values := []string{"a", "b", "c"} for _, v := range values { go func() { fmt.Println(v) done <- true }() } // wait for all goroutines to complete before exiting for _ = range values { <-done } } |
上面這個程式的輸出是 c, c, c,因為由 go 啟動的 closure,共享外層的變數 v,內層的程式還沒完成啟動,外層的 for 迴圈已經跑完,變數 v 的值為 'c',因此印出的值都是一樣的。
程式2 的 for迴圈,輸出 c, a, b
values := []string{"a", "b", "c"} for _, v := range values { go func(u string) { fmt.Println(u) done <- true }(v) } |
程式3 的 for迴圈,輸出 c, a, b
values := []string{"a", "b", "c"} for _, v := range values { v := v // create a new 'v'. go func() { fmt.Println(v) done <- true }() } |
沒有留言:
張貼留言