MST
星途 面试题库

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

请详细描述在Go语言中,使用Context来实现函数执行超时控制的具体步骤和关键代码逻辑。假设你有一个模拟的耗时函数 `func simulateWork(ctx context.Context) error`,请给出包含超时控制的调用示例。
20.8万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
  1. 步骤
    • 创建一个带有超时的 Context
    • 将该 Context 传递给需要控制超时的函数(这里是 simulateWork)。
    • 在被调用函数 simulateWork 中,定期检查 ContextDone 通道,以判断是否超时。
  2. 关键代码逻辑
    • 创建带超时的 Context:使用 context.WithTimeout 函数,它接受一个父 Context(通常是 context.Background()),以及一个超时时间。
    • 在被调用函数中检查超时:通过 ctx.Done() 通道来判断是否收到取消信号,收到则表示超时或被取消。
  3. 调用示例
package main

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

func simulateWork(ctx context.Context) error {
    // 模拟工作,例如睡眠一段时间
    for {
        select {
        case <-ctx.Done():
            return ctx.Err()
        default:
            time.Sleep(100 * time.Millisecond)
            // 这里可以是实际的工作逻辑
        }
    }
}

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

    err := simulateWork(ctx)
    if err != nil {
        fmt.Printf("工作超时: %v\n", err)
    } else {
        fmt.Println("工作正常完成")
    }
}

在上述代码中:

  • context.WithTimeout(context.Background(), 500*time.Millisecond) 创建了一个带500毫秒超时的 Context
  • simulateWork 函数中通过 select 语句监听 ctx.Done() 通道,一旦收到信号,表示超时或被取消,就返回错误。
  • main 函数调用 simulateWork 并处理可能的超时错误。