面试题答案
一键面试在Go语言中,context
包提供了WithTimeout
辅助函数来设置并发任务的超时时间。WithTimeout
函数接受一个父Context
、一个超时时间duration
,返回一个带有超时的Context
以及取消函数CancelFunc
。
以下是一个简单的代码示例:
package main
import (
"context"
"fmt"
"time"
)
func main() {
// 创建一个带有5秒超时的Context
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel() // 确保在函数结束时取消Context,以释放资源
// 在goroutine中使用带有超时设置的Context
go func(ctx context.Context) {
select {
case <-time.After(10 * time.Second):
fmt.Println("任务执行完成(模拟长时间任务)")
case <-ctx.Done():
fmt.Println("任务被取消,原因:", ctx.Err())
}
}(ctx)
// 等待一段时间,确保goroutine有机会执行
time.Sleep(6 * time.Second)
}
在上述代码中:
- 使用
context.WithTimeout
创建了一个带有5秒超时的Context
。 - 在一个新的goroutine中模拟一个需要10秒完成的任务,并通过
select
语句监听任务完成信号(time.After
)和Context
的取消信号(ctx.Done()
)。 - 主函数等待6秒,确保goroutine有足够时间运行,由于设置的超时时间为5秒,所以goroutine会收到取消信号并输出相应信息。