golang--context(上下文)

context.Context 是 Go 语言中用于管理并传递请求范围数据、控制协程生命周期、取消协程执行以及处理超时的机制。在并发编程和网络编程中,context.Context 是非常重要的一部分,它可以帮助开发者优雅地管理协程之间的通信、同步和控制。以下是 context.Context 的使用详解:

1、创建context.Context 对象:

可以使用 context.Background() 函数创建一个空的 context.Context 对象,然后可以使用 context.WithValue(parent, key, value) 函数在其基础上创建带有键值对的新 context.Context 对象。

codectx := context.Background() // 创建空的 context.Context
codeparentCtx := context.Background() 
ctxWithValue := context.WithValue(parentCtx, "key", "value") // 创建带有键值对的 context.Context

2、控制协程生命周期和取消:

使用 context.WithCancel(parent) 函数可以创建一个带有取消信号的 context.Context 对象,并使用返回的 cancel 函数来取消这个上下文对象。取消一个 context.Context 对象会导致与之相关的所有协程被取消。

codeparentCtx, cancel := context.WithCancel(context.Background()) 
go func() { 
    defer cancel() // 在协程执行完成时调用 cancel,以取消上下文 
    // 协程逻辑 
}()

3、处理超时:

使用 context.WithTimeout(parent, timeout) 函数可以创建一个带有超时控制的 context.Context 对象。在指定的超时时间之后,context.Context 对象会自动取消。

codeparentCtx := context.Background() 
timeout := 5 * time.Second 
ctx, cancel := context.WithTimeout(parentCtx, timeout) 
defer cancel() // 在函数返回时调用 cancel,以取消上下文

4、处理截止时间:

使用 context.WithDeadline(parent, deadline) 函数可以创建一个带有截止时间的 context.Context 对象。在指定的截止时间之后,context.Context 对象会自动取消。

codeparentCtx := context.Background() 
deadline := time.Now().Add(10 * time.Second) 
ctx, cancel := context.WithDeadline(parentCtx, deadline) 
defer cancel() // 在函数返回时调用 cancel,以取消上下文

5、传递数据:

使用 context.WithValue(parent, key, value) 函数可以将键值对存储在 context.Context 中,并在协程中共享这些数据。这可以用于传递请求范围的数据,例如用户信息、配置等。

codeparentCtx := context.Background() 
ctxWithValue := context.WithValue(parentCtx, "user", "john_doe")

在协程中使用 context.Context 对象时,可以通过 ctx.Done() 通道来检查是否需要取消协程,通过 ctx.Err() 来获取取消的原因(如超时或取消)。可以使用 ctx.Value(key) 方法来获取存储在 context.Context 中的值。

总之,context.Context 在 Golang 并发编程和网络编程中扮演着重要的角色,它提供了一种优雅且安全的方式来管理协程、控制请求生命周期、取消协程执行和处理超时。在编写具有并发需求的程序时,了解和使用 context.Context 可以大大提高代码的可读性、可维护性和健壮性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Golang 中,可以通过 `context` 包来获取上下文的所有信息。`context` 包提供了一个 `Context` 接口,该接口定义了一组方法,用于获取和设置上下文信息。具体来说,可以通过 `context.Background()` 方法创建一个空的上下文,然后使用 `WithCancel`、`WithDeadline`、`WithTimeout` 或 `WithValue` 等方法来创建一个新的上下文,并在其中设置相应的信息。 例如,以下代码演示了如何创建一个具有超时时间的上下文,并在其中设置一个字符串值: ``` package main import ( "context" "fmt" "time" ) func doSomething(ctx context.Context) { // 获取上下文中的字符串值 value := ctx.Value("key").(string) fmt.Println("value:", value) // 等待上下文超时或被取消 select { case <-ctx.Done(): fmt.Println("context done:", ctx.Err()) case <-time.After(5 * time.Second): fmt.Println("done") } } func main() { // 创建一个具有超时时间的上下文,并设置一个字符串值 ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second) defer cancel() ctx = context.WithValue(ctx, "key", "value") // 在新的 Goroutine 中执行任务 go doSomething(ctx) // 等待一段时间 time.Sleep(10 * time.Second) } ``` 在这个例子中,我们首先使用 `context.Background()` 方法创建了一个空的上下文,然后使用 `context.WithTimeout()` 方法创建了一个具有 3 秒超时时间的新上下文。接着,我们使用 `context.WithValue()` 方法在新上下文中设置了一个字符串值。最后,我们在新的 Goroutine 中执行了一个任务,并等待一段时间,以便让任务有足够的时间执行。在任务中,我们通过 `ctx.Value()` 方法获取了上下文中的字符串值,并使用 `select` 语句等待上下文超时或被取消。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值