取消與收尾
聲明的來源 2 正文連到這篇 2
取消是通知,收尾是確認工作已結束。cancel() 不會強制終止 goroutine,也不等待它返回。
可能阻塞的 send 要有另一條出口:
select {
case out <- value:
case <-ctx.Done():
return
}
select 同時有多個可執行分支時,不保證取消優先。無緩衝的 channel 沒有接收方時,send 不能繼續;取消生效後,便可走取消分支。
需要確認收尾時,另用 WaitGroup 或完成通知。不要把「已呼叫 cancel」當成「工作已結束」。