2 回答
TA贡献1830条经验 获得超3个赞
当您在Go中使用频道时,发件人应始终关闭频道。因为这表明不再有数据将通过该通道发送。
在您的代码中,接收器正在关闭它。只需将此处的通道保持打开状态,然后将其移除即可close(ch)。
func FillNotCheckedDeliveryCh(data IntegrateRowsFields, ch chan<- CommonType.BasicRequestParameters) {
ch <- PackerForNotFinishedCh(data)
defer close(ch)
}
如果那部分有阻塞,您可以使用select:
func FillNotCheckedDeliveryCh(data IntegrateRowsFields, ch chan<- CommonType.BasicRequestParameters) {
select {
case ch <- PackerForNotFinishedCh(data):
default:
}
}
TA贡献1877条经验 获得超1个赞
关闭接收器端的通道,然后尝试在同一通道上发送会给您带来错误。更好的做法是仅在所有值都在通道上发送之后,才在go例程之外关闭该通道。
等待所有执行例程完成后关闭通道。
wg.Wait() close(ch)
当通道上没有其他值要发送时,请始终关闭通道。
接收者可以通过向接收表达式分配第二个参数来测试通道是否已关闭:after
v, ok := <-ch
在您的情况下,您也可以通过使用ok在接收器端进行检查,以查看通道中是否有更多值或通道是否已关闭。
频道不像文件。您通常不需要关闭它们。仅当必须告知接收者没有其他值来终止范围循环时,才需要关闭。
去操场的例子,当不关闭通道并在其上移动时会产生错误。
发送所有值后关闭通道的游乐场示例。
- 2 回答
- 0 关注
- 270 浏览
添加回答
举报