面试题答案
一键面试- 设计思路:
- 使用
goroutine
来执行任务,这样可以实现并发执行。 - 使用
recover
机制在goroutine
内部捕获运行时异常。 - 使用
context.Context
来实现超时功能。
- 使用
- 核心代码示例:
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
函数使用defer
和recover
来捕获运行时异常。- 在
main
函数中,通过context.WithTimeout
设置了一个1秒的超时。 - 使用
select
语句来监听任务结果、错误和超时信号,从而实现健壮的程序结构。