我最近在研究 golang 上下文,發現它WithCancel()以一種有趣的方式實現。func WithCancel(parent Context) (ctx Context, cancel CancelFunc) { if parent == nil { panic("cannot create context from nil parent") } c := newCancelCtx(parent) propagateCancel(parent, &c) return &c, func() { c.cancel(true, Canceled) }}WithCancel()返回一個 ctx,以及一個取消相同上下文的函數。為什么這樣做而不是引入.Cancel()類型本身的函數,比如func (c *cancelCtx) Cancel() { c.cancel(true, Canceled)} 我了解使用 func 返回類型允許您根據運行時條件運行不同的 func,但這里沒有動態 - 它始終是相同的 func。這僅僅是因為功能范式嗎?參考:https ://cs.opensource.google/go/go/+/master:src/context/context.go;l=232-239?q=context&ss=go%2Fgo
1 回答

四季花海
TA貢獻1811條經驗 獲得超5個贊
并非所有上下文都是可取消的。您可能會爭辯說,對于那些不是,該Cancel()
方法可能是無操作的。
Cancel()
但是,無論何時與您合作,您總是必須打電話,context.Context
因為您不(不能)知道它是否真的需要取消。這在很多情況下是不必要的,會使代碼變慢(取消函數通常稱為延遲)并且會使代碼膨脹。
此外,取消上下文的權力僅適用于其創建者。創建者可以選擇通過傳遞/共享取消函數來分擔此責任,但如果不這樣做,則單獨共享上下文不允許(不應允許)取消它。如果Cancel()
是 的一部分context.Context
,則無法執行此限制。有關詳細信息,請參閱從子級取消上下文。
接口——尤其是那些被廣泛使用的接口——應該很小而且最少,不能包含所有很少有用的東西。
- 1 回答
- 0 關注
- 98 瀏覽
添加回答
舉報
0/150
提交
取消