MST

星途 面试题库

面试题:Go语言中如何使用Context实现Goroutine的超时控制

请简述在Go语言里,使用Context对Goroutine进行超时控制的基本步骤,并给出一段简单的示例代码,展示如何创建一个带有超时的Context,并在Goroutine中使用它。
19.0万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
  1. 基本步骤
    • 创建带有超时的Context:使用context.WithTimeout函数,它接受两个参数,一个是父Context(通常用context.Background作为顶级Context),另一个是超时时间。
    • 在Goroutine中传递Context:将创建好的带有超时的Context传递给Goroutine。
    • 在Goroutine中检查Context的Done信号:通过ctx.Done()通道来检测Context是否被取消(超时属于取消的一种情况),如果通道可读,说明Context被取消,Goroutine应该尽快结束。
  2. 示例代码
package main

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

func main() {
    // 创建带有超时的Context
    ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
    defer cancel() // 确保在函数结束时取消Context,释放资源

    go func(ctx context.Context) {
        select {
        case <-time.After(3 * time.Second):
            fmt.Println("任务完成(模拟)")
        case <-ctx.Done():
            fmt.Println("任务超时被取消")
        }
    }(ctx)

    time.Sleep(3 * time.Second)
}