我最近在研究 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,還有一個 func 來取消完全相同的背景關系。為什么這樣做而不是引入.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/go
uj5u.com熱心網友回復:
并非所有背景關系都可以取消。您可能會爭辯說,對于那些不是,該Cancel()方法可能是無操作的。
但是,Cancel()無論何時與您合作,context.Context您都必須打電話,因為您不(不能)知道它是否真的需要取消。這在很多情況下是不必要的,會使代碼變慢(取消函式通常稱為延遲)并且會使代碼膨脹。
此外,取消背景關系的權力僅適用于其創建者。創建者可以選擇通過傳遞/共享取消功能來分擔此責任,但如果不這樣做,則單獨共享背景關系不允許(不應允許)取消它。如果Cancel()是 的一部分context.Context,則無法執行此限制。有關詳細資訊,請參閱從 child 取消背景關系。
介面——尤其是那些廣泛使用的介面——應該是小而最小的,不包含所有的、很少有用的東西。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/373127.html
標籤:走
