当前位置:首页 > 文章列表 > Golang > Go问答 > 在Golang中为什么要返回函数

在Golang中为什么要返回函数

来源:stackoverflow 2024-02-22 19:54:26 0浏览 收藏

欢迎各位小伙伴来到golang学习网,相聚于此都是缘哈哈哈!今天我给大家带来《在Golang中为什么要返回函数》,这篇文章主要讲到等等知识,如果你对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


正确答案


并非所有上下文都可以取消。您可能会说,对于那些不这样做的人来说,Cancel() 方法可能是无操作的。

但是,每当您使用 context.Context 时,您总是必须调用 Cancel() ,因为您不(不能)知道它是否真的需要取消。这在很多情况下是不必要的,会使代码变慢(取消函数通常称为延迟函数)并且会使代码膨胀。

此外,取消上下文的权力仅适用于其创建者。创建者可以选择通过传递/共享取消函数来分担此责任,但如果不这样做,则单独共享上下文不允许(不应该允许)取消它。如果 Cancel()context.Context 的一部分,则无法强制执行此限制。详情请参见Cancel context from child

接口(尤其是那些广泛使用的接口)应该很小且最少,不包含所有很少有用的东西。

终于介绍完啦!小伙伴们,这篇关于《在Golang中为什么要返回函数》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布Golang相关知识,快来关注吧!

版本声明
本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
深入探讨如何使用jQuery删除表格中的td元素深入探讨如何使用jQuery删除表格中的td元素
上一篇
深入探讨如何使用jQuery删除表格中的td元素
使用 goquery 获取<select>标签中<option>标签的值
下一篇
使用 goquery 获取
登录即同意 用户协议隐私政策
返回登录
  • 重置密码