说说你了解的context?代码中哪里会用到?

66 阅读2分钟

在 Go 语言中,context 是一种用于在多个 goroutine 之间传递请求作用域数据、取消信号和截止时间的标准库。context 可以用于控制 goroutine 的生命周期,解决 goroutine 泄漏和取消等问题。

context 的主要作用有:

  • 传递请求作用域数据:context 可以用于在多个 goroutine 之间传递请求作用域数据,例如用户认证信息、请求 ID 等。这些数据可以通过 contextWithValue 方法设置,在整个请求处理过程中传递,并且不需要显式地传递给每个函数。
  • 控制 goroutine 生命周期:context 可以用于取消 goroutine,以避免 goroutine 泄漏或等待时间过长。当一个 context 被取消时,与该 context 相关的所有 goroutine 都会被取消。
  • 传递截止时间:context 可以用于传递截止时间,例如请求超时时间。当超过截止时间时,可以取消相关的 goroutine。

在代码中,context 可以用于控制 goroutine 的生命周期、传递请求作用域数据和截止时间等。例如,在 HTTP 服务器中,可以使用 context 来传递请求作用域数据和截止时间,例如:

go
复制代码
func handler(w http.ResponseWriter, r *http.Request) {

  ctx := r.Context()

  // 在 ctx 中设置请求作用域数据

  ctx = context.WithValue(ctx, "user", "Alice")

  // 在 ctx 中设置截止时间

  ctx, cancel := context.WithTimeout(ctx, time.Second)

  defer cancel()

  // 使用 ctx 处理请求

  err := doSomething(ctx)

  if err != nil {

    http.Error(w, err.Error(), http.StatusInternalServerError)

    return

  }

  // ...

}

在这个例子中,使用 r.Context() 获取请求的 context,然后使用 context.WithValuecontext.WithTimeout 方法分别设置请求作用域数据和截止时间。在处理请求的过程中,使用 ctx 来控制 goroutine 的生命周期和处理请求。

标签:

青训营笔记

作者:用户8393410288470
链接:juejin.cn/post/723703…
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。