gpt4 book ai didi

go - Go的标准上下文包和Gorilla上下文包的区别

转载 作者:IT王子 更新时间:2023-10-29 00:50:54 25 4
gpt4 key购买 nike

有什么区别?哪个更厉害?是否可以通过仅使用标准 context 而不使用任何第三方库来完成同样的事情?

最佳答案

gorilla 的语境包

stores values shared during a request lifetime.

官方context

carries deadlines, cancelation signals, and other request-scoped values across API boundaries and between processes.

所以从一开始,很明显官方包的功能要多得多。但在进入细节之前,先了解一些历史:

Gorilla 的上下文包早于官方的 Go 上下文包。它的创建是为了解决响应 HTTP 请求时的一个基本问题:不同的中间件和处理程序需要能够共享请求范围内的状态。诸如经过身份验证的用户名和用户 ID,以及在将信息发送到要解析的模板之前从数据库中检索到的信息结果等。

Gorilla 的 context 包通过一个非常丑陋的 hack 来做到这一点:它创建一个以 HTTP 请求指针作为键的映射。为了使这种并发安全,它将对该映射的所有访问都包装在互斥体中,这使得访问速度变慢(尽管实际上,它可能只对非常繁忙的网站有影响)。

如前所述,Go 上下文包是后来出现的,考虑到了不同的需求。 Go 上下文包的存在主要是为了解决不再需要操作后取消操作的问题。

在此之前,如果您正在处理一个 HTTP 请求,而用户关闭了他们的网络浏览器或点击了“停止”按钮,或者他们的 wifi 连接断开了,您将无从知晓。您的服务器会愉快地继续运转,从数据库中获取值,呈现模板等,只是为了将结果发送回......没有人。

或者您的程序可能需要从一堆远程 API 中获取数据,但您只愿意等待 10 秒。 10 秒后,您想取消待处理的请求。

使用 Go 上下文包,这些事情是可能的——而且很容易。通过提供可取消的上下文,http 库现在可以告诉您的 HTTP 服务器 HTTP 请求已被客户端取消。或者您可以为后一种情况设置超时上下文。

所以你可以看到,这两个包旨在解决完全不同的问题。

但是,官方的 Go context 包还有一个额外的特性。 WithValue方法允许您在上下文中传递任意数据。这确实与 Gorilla 的上下文包具有相同的目的,但有点像事后的想法。

最近的最佳做法是使用官方上下文包。但这主要是为了取消目的。作为次要好处,您还可以使用它来传递值——与您在 Gorilla 的上下文中传递的值类型相同。

但是,如果您使用它来传递值,那么您将失去大约 90% 的好处。

关于go - Go的标准上下文包和Gorilla上下文包的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43704483/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com