为什么在 Golang 中返回一个函数

我最近在研究 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


九州编程
浏览 55回答 1
1回答

四季花海

并非所有上下文都是可取消的。您可能会争辩说,对于那些不是,该Cancel()方法可能是无操作的。Cancel()但是,无论何时与您合作,您总是必须打电话,context.Context因为您不(不能)知道它是否真的需要取消。这在很多情况下是不必要的,会使代码变慢(取消函数通常称为延迟)并且会使代码膨胀。此外,取消上下文的权力仅适用于其创建者。创建者可以选择通过传递/共享取消函数来分担此责任,但如果不这样做,则单独共享上下文不允许(不应允许)取消它。如果Cancel()是 的一部分context.Context,则无法执行此限制。有关详细信息,请参阅从子级取消上下文。接口——尤其是那些被广泛使用的接口——应该很小而且最少,不能包含所有很少有用的东西。
打开App,查看更多内容
随时随地看视频慕课网APP