无缓冲chan

阻塞等待


无缓冲chan

阻塞等待


有缓冲chan

先读后阻塞


有缓冲chan

先写后阻塞


close的无缓冲chan

读到零值,可通过ok判断


close的无缓冲chan

panic


close的有缓冲chan

先读,后读到零值,可通过ok判断


close的有缓冲chan

panic


nil的chan

阻塞


nil的chan

阻塞

1、读时:先读、再阻塞等待、同时通过ok判断是否close(即是否真正取到值,因为有缓冲chan在close后会取到零值);

2、写时:先写,再阻塞等待、写close的chan会panic;

3、nil的chan读写都会阻塞;

4、for range等同于for ok break,即:

// for ok
for {
item, ok := <-ch
if ok {
fmt.Println(item)
} else {
break
}
}

// for range
for item := range ch {
fmt.Println(item)
}

5、channel应应用于两个go程中,在一个go程可能发生死锁。

6、关闭未初始化的通道;重复关闭通道;向已经关闭的通道中发送数据;这三种情况也会引发 panic

Golang之channel操作_golang