MST

星途 面试题库

面试题:Go future模式下异常恢复与超时处理的协同设计

在Go的future模式下,一个任务可能会发生运行时异常(如数组越界),同时你需要为这个任务设置超时机制。请描述如何设计一个健壮的程序结构,既能捕获并处理异常,又能实现超时功能,同时给出核心代码示例展示如何在goroutine中进行异常捕获、超时检测以及结果返回。
39.3万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
  1. 设计思路
    • 使用goroutine来执行任务,这样可以实现并发执行。
    • 使用recover机制在goroutine内部捕获运行时异常。
    • 使用context.Context来实现超时功能。
  2. 核心代码示例
package main

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

// 模拟一个可能会发生运行时异常的任务
func riskyTask(ctx context.Context) (int, error) {
    defer func() {
        if r := recover(); r != nil {
            fmt.Printf("捕获到运行时异常: %v\n", r)
        }
    }()
    // 模拟一些计算
    time.Sleep(2 * time.Second)
    // 这里模拟一个数组越界异常
    var arr [1]int
    return arr[1], nil
}

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

    resultChan := make(chan int, 1)
    errChan := make(chan error, 1)

    go func() {
        result, err := riskyTask(ctx)
        if err != nil {
            errChan <- err
        } else {
            resultChan <- result
        }
    }()

    select {
    case result := <-resultChan:
        fmt.Printf("任务成功执行,结果: %d\n", result)
    case err := <-errChan:
        fmt.Printf("任务执行出错: %v\n", err)
    case <-ctx.Done():
        fmt.Println("任务执行超时")
    }
}

这段代码中:

  • riskyTask函数使用deferrecover来捕获运行时异常。
  • main函数中,通过context.WithTimeout设置了一个1秒的超时。
  • 使用select语句来监听任务结果、错误和超时信号,从而实现健壮的程序结构。