无名阁,只为技术而生。流水不争先,争的是滔滔不绝。

(golang context) 一文让你理解go语言的Context 理解 Go 语言中的 Context 全网首发(图文详解1)

前沿技术 Micheal 6个月前 (06-11) 69次浏览 已收录 扫描二维码

(golang context) 一文让你理解go语言的Context

理解Go语言的Context是开发中一个很重要的概念,特别是在处理并发请求、API调用和处理超时时尤为重要。Context类型在context包中定义,主要用于控制多个Goroutine之间的生命周期、信号的传递和请求相关的数据传递。

1. 什么是Context

Context类型是Go语言在1.7版本引入的,用于简化对于处理单个请求的多个Goroutines之间与请求域的数据、取消信号、截止时间等共享的方式。

2. 使用Context

使用场景

  • 取消操作:当多个Goroutines处理一个任务,但你想提前取消整个任务时。
  • 传递数据:向多个Goroutines传递请求特别的数据。
  • 截止时间:为整个请求或单个操作设置截止时间。

基本操作

  • 创建Context:context.Background()context.TODO()是创建根Context的两个方法。Background通常用于main函数、初始化以及测试中,而TODO用于不确定应使用哪种Context时。
  • 派生Context:可以通过WithCancelWithDeadlineWithTimeoutWithValue方法派生子Context。

3. 示例代码

下面是一个使用WithCancel函数来取消正在执行的Goroutine的简单示例代码:

package main

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

func operation(ctx context.Context, name string) {
    for {
        select {
        case <-time.After(1 * time.Second):
            fmt.Println(name, "is running")
        case <-ctx.Done():
            fmt.Println(name, "is stopped")
            return
        }
    }
}

func main() {
    // 创建一个可取消的context
    ctx, cancel := context.WithCancel(context.Background())

    // 启动Goroutine进行操作
    go operation(ctx, "task1")

    // 等待一段时间后取消操作
    time.Sleep(3 * time.Second)
    cancel()

    // 等待Goroutine结束
    time.Sleep(1 * time.Second)
}

这个代码片段首先通过context.Background()创建了一个根Context,然后通过WithCancel创建了一个可取消的子Context。我们在operation函数中通过检测ctx.Done()来判断是否接收到了取消信号,并据此停止运行。

4. 注意事项

  • 避免将Context存储在结构体中,Context应当作为参数传递。
  • 当传递Context时,应当作为函数的第一个参数。
  • 应该使用context.TODO()当不确定应该使用哪个Context或当前没有可用的Context。
  • WithValue方法应谨慎使用,它用于在Goroutines间传递请求相关的值,而不是用来传递可选参数给函数。

Context的应用是广泛的,从简单的取消操作到在微服务架构下进行超时控制和传递请求特定数据都非常实用。正确的使用Context能够让我们更好地控制和管理并发操作。
(美国apple id) Apple ID怎么注册美区?Apple ID海外地区注册教程 创建美区Apple ID:注册详细步骤 全网首发(图文详解1)
(mac maven) Mac Maven环境搭建安装和配置超详细步骤 Mac上Maven环境搭建 全网首发(图文详解1)

喜欢 (0)
[]
分享 (0)
关于作者:
流水不争先,争的是滔滔不绝