为了账号安全,请及时绑定邮箱和手机立即绑定

为什么在 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 关注
  • 50 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信