goroutine 小問題

goroutine在使用channel同步和通信時,因爲變量的共享訪問特性,需要注意goroutine訪問的變量是否被修改。

如下代碼,看似合理,實際上因爲i在main routine中已經被修改,會出現index越界訪問異常。


package main


import (
    "fmt"
    "strconv"
    "time"
)

func main() {

    const MAX = 3
    cs := make([]chan string, MAX)

    for i := 0; i < MAX; i++ {
        fmt.Println("count i=", i)
        cs[i] = make(chan string)

        go func() {
            for {

                cs[i] <- "sender:" + strconv.Itoa(i)

                time.Sleep(time.Millisecond * 500)
                /////fmt.Println(<-cs[i])
            }
        }()

    }

    go func() {
        for {
            select {

            case msg1 := <-cs[0]:
                fmt.Println(msg1)
            case msg2 := <-cs[1]:
                fmt.Println(msg2)
            case msg3 := <-cs[2]:
                fmt.Println(msg3)

            case <-time.After(time.Second):
                //fmt.Println("timeout reading ")
            default:
                //fmt.Println("No channel ready")

            }
        }
    }()


    fmt.Scanln()
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章