2017年2月7日 星期二

難以理解的 GoLang Closure

GoLang Closures Running as Go routines
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
        }()
    }

沒有留言: