Golang中context的种类

Go语言中的context包提供了一种在多个goroutine之间传递取消信号、超时和截止时间的机制。它是在处理需要跟踪或取消操作的并发程序时非常有用的工具。下面是context包的一些常见用法示例:

1, 创建一个context.Context:

使用context.Background()函数创建一个基础的Context,它通常用于顶层的goroutine,没有父Context。

ctx := context.Background()

2,创建一个带有超时的Context:

使用context.WithTimeout()函数创建一个在指定时间后自动取消的Context。

import (
    "context"
    "time"
)

ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel() // 在完成操作后取消Context

3, 创建一个带有截止时间的Context:

使用context.WithDeadline()函数创建一个在指定截止时间后自动取消的。

Copy code
import (
    "context"
    "time"
)

deadline := time.Now().Add(10 * time.Second)
ctx, cancel := context.WithDeadline(context.Background(), deadline)
defer cancel() // 在完成操作后取消Context

4, 创建一个可以手动取消的Context:

使用context.WithCancel()函数创建一个可以手动取消的Context,通常用于外部触发取消操作。

import "context"

ctx, cancel := context.WithCancel(context.Background())

// 在需要取消时调用cancel函数
cancel()

5, 从Context中获取取消信号:

通过ctx.Done()通道来获取取消信号,当Context被取消或超时时,这个通道会被关闭。

select {
case <-ctx.Done():
    // 处理取消信号或超时
}

6, 在goroutine中使用Context:

将Context传递给goroutine,以便它们能够接收取消信号或超时信号。

go func(ctx context.Context) {
    for {
        select {
        case <-ctx.Done():
            // 处理取消信号或超时
            return
        default:
            // 执行正常操作
        }
    }
}(ctx)

7, 创建一个设置键值对的Context

使用context.WithValue函数将自定义的键值对添加到Context中,以便在整个Context树中传递和检索这些值。

package main

import (
    "context"
    "fmt"
)

// 定义一个自定义的上下文键类型
type keyType string

func main() {
    // 创建一个带有自定义键值对的Context
    ctx := context.WithValue(context.Background(), keyType("UserID"), "12345")

    // 在不同部分的代码中检索自定义键值对
    userID, ok := ctx.Value(keyType("UserID")).(string)
    if ok {
        fmt.Printf("UserID: %s\n", userID)
    } else {
        fmt.Println("UserID 未找到")
    }
}

context.WithValue函数用于传递与上下文相关的数据,但请谨慎使用它,因为它不提供任何锁定或同步功能,因此不适合用于在并发环境中频繁更改数据。如果需要在多个goroutine之间共享数据,应使用更适合并发操作的数据结构和同步机制。

总结

这些是context包的一些常见用法示例。使用context可以有效地管理goroutine之间的并发操作,并允许你在需要时安全地取消它们。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容