读 | 无缓冲chan | 阻塞等待 |
写 | 无缓冲chan | 阻塞等待 |
读 | 有缓冲chan | 先读后阻塞 |
写 | 有缓冲chan | 先写后阻塞 |
读 | close的无缓冲chan | 读到零值,可通过ok判断 |
写 | close的无缓冲chan | panic |
读 | close的有缓冲chan | 先读,后读到零值,可通过ok判断 |
写 | close的有缓冲chan | panic |
读 | nil的chan | 阻塞 |
写 | nil的chan | 阻塞 |
1、读时:先读、再阻塞等待、同时通过ok判断是否真正取到值(因为有缓冲chan在close后会取到零值);
2、写时:先写,再阻塞等待、写close的chan会panic;
3、nil的chan读写都会阻塞;
4、for range等同于for ok,即:
// for ok
for {
item, ok := <-ch
if ok {
fmt.Println(item)
} else {
break
}
}
// for range
for item := range ch {
fmt.Println(item)
}