Go: channel meet range

 
package main


import "fmt"


func Count(ch chan int) {
    fmt.Println("Do Something")
    //do something work
    ch <- 1
}


func main() {
    chs := make([]chan int, 10)

    /*

     * 這樣初始channel數組纔是對的 (標1)
     *for i := 0; i < 10; i++ {
     *	chs[i] = make(chan int)
     *	go Count(chs[i])
     *}
    */

       //下面這樣是不行的,要deadlock的(標2)
    for _, ch := range chs {
        ch = make(chan int)
        go Count(ch)
    }

         //這樣也是可以的,沒有問題(標3)
    for _, ch := range chs {
        <-ch
    }

}



爲什麼標2,3處都用range,前者卻產生deadlock(應該採用標1),後者沒有問題呢?

因爲“If you're looping over an array, slice, string, or map, or reading from a channel, a range clause can manage the loop.

大意是range可以用於循環遍歷數組,切片,字符串或者從channel讀取數據,但沒有寫入數據

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