1 回答

TA貢獻1893條經驗 獲得超10個贊
從上下文中。WithCancel
文檔
當調用返回的 cancel 函數或父上下文的 Done 通道時(以先發生者為準),返回上下文的 Done 通道將關閉。
從上下文中。上下文
文檔
Done 返回一個通道,當代表此上下文完成的工作應被取消時,該通道已關閉。
取消上下文不應意味著“銷毀此上下文”或“使此上下文不再可用”。這純粹是向上下文的用戶發出信號,表明工作應該被取消。此信號不是魔術,必須明確檢查。
請考慮以下情況:
select {
case <-ctx.Done():
return
default:
value := ctx.Value("something")
doSomething(value)
}
現在想象一下,上下文按照您的想象工作,在取消時,值不再可檢索。這種情況現在可能是可能的:
select {
case <-ctx.Done():
return
default:
// OH NO! Even though we just checked and it was ok,
// some other goroutine called cancel() right at this moment!
value := ctx.Value("something")
// Now "value" is going to be invalid.
doSomething(value)
}
現有的上下文模型很有幫助,因為它允許工作例程僅在最安全或最方便的特定檢查點檢查上下文狀態,而在其他情況下不必擔心它。
- 1 回答
- 0 關注
- 85 瀏覽
添加回答
舉報