我最近在研究 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 关注
- 68 浏览
添加回答
举报
0/150
提交
取消