MST

星途 面试题库

面试题:Go中Context取消机制的基本原理

请简要阐述Go语言中Context取消机制是如何工作的,包括涉及到的主要结构体和方法。
16.0万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

Context取消机制工作原理

  1. 信号传递:在Go语言中,Context用于在多个goroutine之间传递取消信号。当一个Context被取消时,所有从它派生出来的子Context也会被取消,进而通知相关的goroutine停止工作。
  2. 控制资源:常用于控制资源(如网络请求、数据库连接等)的生命周期,避免资源泄露。当操作不再需要时,可以通过取消Context来快速释放资源。

主要结构体

  1. Context
    • 它是一个接口类型,定义了四个方法:DeadlineDoneErrValue
    • 所有具体的Context实现都要满足这个接口。
  2. cancelCtx
    • 它是实现取消功能的核心结构体,嵌套了 Context 接口。
    • 包含一个 cancel 函数,用于取消自身及其子Context。
    • 有一个 mu 字段用于互斥锁,保证并发安全。
  3. timerCtx
    • 嵌入了 cancelCtx 结构体,用于实现带截止时间或超时的Context。
    • 包含一个 timer 字段,是一个指向 time.Timer 的指针,用于定时触发取消。
  4. emptyCtx
    • Context 接口的空实现,用于表示根Context。
    • 有两种类型:backgroundtodo,分别通过 context.Background()context.TODO() 函数获取。

主要方法

  1. context.WithCancel(parent Context) (ctx Context, cancel CancelFunc)
    • 创建一个可取消的Context,返回新的Context和取消函数 cancel
    • 调用 cancel 函数会取消这个Context及其所有子Context。
  2. context.WithDeadline(parent Context, deadline time.Time) (Context, CancelFunc)
    • 创建一个在指定截止时间自动取消的Context。
    • 当截止时间到达,Context会自动取消。
  3. context.WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc)
    • 创建一个在指定超时时间后自动取消的Context。
    • 它是 WithDeadline 的便捷包装,根据当前时间加上超时时间计算截止时间。
  4. ctx.Done() <-chan struct{}
    • 返回一个只读通道。
    • 当Context被取消或过期时,这个通道会被关闭,goroutine可以通过监听这个通道来得知Context的取消信号。
  5. ctx.Err() error
    • 返回Context被取消的原因。
    • 如果Context还未取消,返回 nil;如果是被取消,返回 context.Canceled;如果是超时,返回 context.DeadlineExceeded