go语言中channel中的小坑记录

1. 普通channel的注意事项
1)channel只能存放指定类型的数据类型,注意在channel中放置空接口类型在取出数据的时候,要使用类型断言操作的;
2)当只有一个gorutinue操作channel的时候,当channel的数据已经放满后,就不能在放入数据了,否则就会发生dead lock的错误; 但是当有多个线程对该channel进行操作的时候,比如有其余的gorutinue是从channel中取出数据的,那么添加数据的操作就会进行阻塞操作,不会发生dead lock的;
3)如果从channel中取出数据后,可以继续放入数据的
4)在没有使用协程的情况下,如果 channel 数据取完了,再取,就会报 dead lock; 但是如果没有关闭channel的时候是报dead lock的 要是channel已经关闭了 会输出默认的零值的 无论输出的个数是否已经超过channel的个数的大小的
如果编译器发现一个channel,只有写没有读的话,则该channel是会被阻塞的,但是要是有读的话,频率不一致也是无所谓的。

2. 已经使用close函数关闭的通道的特性
1)对一个关闭的通道再发送值就会导致panic。
2)对一个关闭的通道进行接收会一直获取值直到通道为空。
3)对一个关闭的并且没有值的通道执行接收操作会得到对应类型的零值。注意这个可以取出无数次的
4)关闭一个已经关闭的通道会导致panic
5)当 channel 关闭后,就不能再向 channel 写数据了,但是仍然 可以从该 channel 读取数据

3.channel遍历的注意事项
channel 支持 for–range 的方式进行遍历,请注意两个细节

在遍历时,如果 channel 没有关闭,则回出现 deadlock 的错误
在遍历时,如果 channel 已经关闭,则会正常遍历数据,遍历完后,就会退出遍历。
3)channel尽量不要使用for i 这种遍历的方式的。
多gorutinue下的访问channel的一些问题总结:

Posted in Go