我允许你还不清楚go的context上下文!!!

context结构

在Go语言中,context是一个标准库中提供的用于处理请求的上下文结构。它被设计用于在多个Goroutine之间传递请求特定的数据、取消信号以及处理请求的截止时间。

context结构的定义如下:

scss 复制代码
type Context interface {
    Deadline() (deadline time.Time, ok bool)
    Done() <-chan struct{}
    Err() error
    Value(key interface{}) interface{}
}

context结构包含了以下几个方法:

  • Deadline():返回一个时间戳,表示上下文的截止时间,以及一个布尔值,表示是否存在截止时间。
  • Done():返回一个只读的通道,当上下文被取消或超时时,该通道会被关闭。
  • Err():返回一个错误,表示为什么上下文被取消。
  • Value(key interface{}):返回与键关联的值,用于在请求范围内传递请求特定的数据。

context应用场景

当在业务中使用context时,主要有以下三个主要应用场景:

  1. 上下文控制:
    context可以用于控制请求的生命周期,包括超时时间和取消请求。通过设置上下文的截止时间,可以确保请求在指定的时间内完成,避免资源的长时间占用。当超过指定的截止时间时,上下文会自动取消请求,并通过Done()方法返回的通道发送取消信号。这样可以及时释放资源,并且可以在请求处理中检查上下文的取消状态,以便在必要时停止处理逻辑。
  2. 多个Goroutine之间的数据交互:
    context可以在多个Goroutine之间传递请求特定的数据。通过contextValue()方法,可以将请求特定的数据与上下文关联起来,并在不同的Goroutine中访问这些数据。这样可以避免使用全局变量或参数传递的方式,在不同的函数之间传递数据,使得代码更加清晰和可维护。
  3. 超时控制:
    context可以用于设置请求的超时时间,即在指定的时间内完成请求,否则将被取消。通过设置上下文的截止时间,可以确保请求在合理的时间范围内完成,避免请求长时间等待导致的性能问题。当超过指定的超时时间时,上下文会自动取消请求,并通过Done()方法返回的通道发送取消信号。这样可以及时释放资源,并且可以在请求处理中检查上下文的取消状态,以便在必要时停止处理逻辑。

当使用context进行上下文控制、多个Goroutine之间的数据交互和超时控制时,可以使用以下代码示例来说明:

go 复制代码
package main

import (
	"context"
	"fmt"
	"time"
)

func main() {
	// 创建一个父上下文
	parentCtx := context.Background()

	// 创建一个带有取消功能的子上下文,设置超时时间为2秒
	ctx, cancel := context.WithTimeout(parentCtx, 2*time.Second)
	defer cancel()

	// 在Goroutine中处理请求
	go processRequest(ctx)

	// 等待一段时间,模拟请求的处理时间
	time.Sleep(3 * time.Second)

	// 取消请求
	cancel()

	// 等待一段时间,以确保请求已被取消
	time.Sleep(1 * time.Second)
}

func processRequest(ctx context.Context) {
	// 模拟请求处理逻辑
	for {
		select {
		case <-ctx.Done():
			// 请求被取消或超时
			fmt.Println("Request canceled or timed out.")
			return
		default:
			// 处理请求
			fmt.Println("Processing request...")
			time.Sleep(500 * time.Millisecond)
		}
	}
}

在上面的示例中,我们创建了一个父上下文parentCtx,然后使用context.WithTimeout()函数创建了一个带有取消功能的子上下文ctx,并设置超时时间为2秒。然后,我们在processRequest()函数中使用select语句检查上下文的取消状态,如果上下文被取消或超时,就停止处理请求。

main()函数中,我们启动了一个Goroutine来处理请求,并等待3秒,模拟请求的处理时间。然后,我们调用cancel()函数取消请求。最后,我们等待1秒,以确保请求已被取消。

通过这个示例,我们展示了如何使用context进行上下文控制和超时控制,以及在多个Goroutine之间传递上下文。

相关推荐
Tech Synapse39 分钟前
Java根据前端返回的字段名进行查询数据的方法
java·开发语言·后端
.生产的驴39 分钟前
SpringCloud OpenFeign用户转发在请求头中添加用户信息 微服务内部调用
spring boot·后端·spring·spring cloud·微服务·架构
微信-since811921 小时前
[ruby on rails] 安装docker
后端·docker·ruby on rails
代码吐槽菌3 小时前
基于SSM的毕业论文管理系统【附源码】
java·开发语言·数据库·后端·ssm
豌豆花下猫3 小时前
Python 潮流周刊#78:async/await 是糟糕的设计(摘要)
后端·python·ai
YMWM_3 小时前
第一章 Go语言简介
开发语言·后端·golang
码蜂窝编程官方3 小时前
【含开题报告+文档+PPT+源码】基于SpringBoot+Vue的虎鲸旅游攻略网的设计与实现
java·vue.js·spring boot·后端·spring·旅游
hummhumm4 小时前
第 25 章 - Golang 项目结构
java·开发语言·前端·后端·python·elasticsearch·golang
J老熊4 小时前
JavaFX:简介、使用场景、常见问题及对比其他框架分析
java·开发语言·后端·面试·系统架构·软件工程
AuroraI'ncoding4 小时前
时间请求参数、响应
java·后端·spring