对于缓冲channel可以使用range来读取:
func main() {
ch := make(chan int, 3)
ch <- 1
ch <- 2
ch <- 3
for c := range ch {
fmt.Println(c)
}
}
上面例子可以正常读取数据,但是会出现死锁。主要由于range不等到信道关闭,不会结束读取,阻塞当前的gorouting,导致死锁。
显式的关闭信道:
func main() {
ch := make(chan int, 3)
ch <- 1
ch <- 2
ch <- 3
close(ch)
for c := range ch {
fmt.Println(c)
}
}
被关闭的信道禁止数据写入,是可读的,可以从关闭的信道中读取数据。