typora/daliy_note/10.24/context.Context.md
2024-12-12 10:48:55 +08:00

2.1 KiB

是的,在 Go 语言中,context.Context 是一个接口类型,而接口在 Go 中是引用类型。具体来说,context.Context 提供了一种管理请求范围内数据、取消信号和超时的方式,是用于处理并发编程中的上下文信息的常用工具。

context.Context 基础

  • 接口类型: context.Context 是一个接口,这意味着它定义了一组方法,但不包含数据本身。实现 context.Context 接口的具体类型如 context.Background()context.TODO() 都是引用类型。

  • 常用方法:

    • Deadline() (deadline time.Time, ok bool): 返回上下文被取消的时间。
    • Done() <-chan struct{}: 返回一个通道,当上下文被取消或到达截止时间时,该通道会被关闭。
    • Err() error: 返回上下文被取消的原因。
    • Value(key interface{}) interface{}: 从上下文中检索与键关联的值。

使用 context.Context

context.Context 通常用于管理请求的生命周期,特别是在处理 HTTP 请求、RPC 调用或其他需要在一段时间内传递上下文信息的操作时。

package main

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

func main() {
    ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
    defer cancel()

    select {
    case <-time.After(1 * time.Second):
        fmt.Println("operation completed")
    case <-ctx.Done():
        fmt.Println("timeout:", ctx.Err())
    }
}

传递和取消

  • 传递引用: 因为 context.Context 是引用类型,所以通常将它作为第一个参数传递给需要上下文信息的函数。这是因为引用类型允许在多个函数间共享同一个上下文实例。

  • 取消操作: 通过使用例如 context.WithCancelcontext.WithTimeout 等函数,可以生成一个可取消的上下文,并在操作完成或超时时调用取消函数。

总之,context.Context 的设计使其适合用于并发编程中传递请求范围内的信息和取消信号,并且由于它是引用类型,传递它时不会产生额外的复制开销。