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读取数据,但没有写入数据。