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讀取數據,但沒有寫入數據。