谢邀。
在Go语言channel中使用单向管道遍历需要注意下列问题。
问题① for-range线程阻塞
报错:
0 1 2 3 4 5 6 7 8 9 fatal error: all goroutines are asleep - deadlock!
原因
在写完数据后没有关闭管道,导致在for-range遍历的时候协程阻塞了
解决方案
如果使用for-range遍历一定要记得写完数据后关闭通道
问题② ok-idiom线程阻塞
报错:
0 1 2 3 4 5 6 7 8 9 fatal error: all goroutines are asleep - deadlock!
原因
ok-idiom的方式遍历和for-range一样,如果读不到管道中的数据会阻塞协程
解决方案
写完数据后关闭管道
问题
fori遍历管道不阻塞,但死循环
出现问题:死循环
原因
fori的方式循环从管道中取数据,如果管道中没有数据了,会从管道中读取管道类型的默认零值
解决方案
写完数据后关闭管道
总结
for-range和ok-idiom的方式遍历如果不关闭管道会发生error,fori遍历会死循环
根据业务需求,写完数据后关闭管道是个好习惯。