亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么在 Golang 中返回一個函數

為什么在 Golang 中返回一個函數

Go
九州編程 2022-10-17 16:02:44
我最近在研究 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,則無法執行此限制。有關詳細信息,請參閱從子級取消上下文。

接口——尤其是那些被廣泛使用的接口——應該很小而且最少,不能包含所有很少有用的東西。


查看完整回答
反對 回復 2022-10-17
  • 1 回答
  • 0 關注
  • 98 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號