MST
星途 面试题库

面试题:Go中如何使用Context实现简单的超时控制

请描述在Go语言中,使用`context.Context`实现一个函数调用在指定时间内超时的基本步骤,并给出一个简单的代码示例。
31.3万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

基本步骤

  1. 创建一个带有超时的context.Context。通常使用context.WithTimeout函数,它接受一个父context(通常是context.Background())和一个超时时间。
  2. 将创建的context传递给需要设置超时的函数。
  3. 在被调用的函数内部,定期检查contextDone通道,以判断是否超时。如果Done通道接收到值,说明已经超时,函数应停止当前操作并返回。

代码示例

package main

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

func longRunningFunction(ctx context.Context) error {
    select {
    case <-time.After(2 * time.Second): // 模拟一个长时间运行的任务
        return nil
    case <-ctx.Done():
        return ctx.Err()
    }
}

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

    err := longRunningFunction(ctx)
    if err != nil {
        fmt.Println("Function timed out:", err)
    } else {
        fmt.Println("Function completed successfully")
    }
}

在上述代码中:

  1. context.WithTimeout(context.Background(), 1*time.Second)创建了一个带有1秒超时的context,并返回ctxcancel函数,cancel函数用于手动取消context(这里使用defer确保函数结束时无论是否超时都会取消context)。
  2. longRunningFunction函数内部使用select语句监听time.After(2 * time.Second)ctx.Done()。如果ctx.Done()先接收到值,说明超时,函数返回ctx.Err()
  3. main函数中调用longRunningFunction,并根据返回的错误判断函数是否超时。