在 Go 语言中,context 是一种用于在多个 goroutine 之间传递请求作用域数据、取消信号和截止时间的标准库。context 可以用于控制 goroutine 的生命周期,解决 goroutine 泄漏和取消等问题。
context 的主要作用有:
- 传递请求作用域数据:
context可以用于在多个 goroutine 之间传递请求作用域数据,例如用户认证信息、请求 ID 等。这些数据可以通过context的WithValue方法设置,在整个请求处理过程中传递,并且不需要显式地传递给每个函数。 - 控制 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.WithValue 和 context.WithTimeout 方法分别设置请求作用域数据和截止时间。在处理请求的过程中,使用 ctx 来控制 goroutine 的生命周期和处理请求。
标签:
作者:用户8393410288470
链接:juejin.cn/post/723703…
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。