面试题答案
一键面试- 步骤:
- 创建一个带有超时的
Context
。 - 将该
Context
传递给需要控制超时的函数(这里是simulateWork
)。 - 在被调用函数
simulateWork
中,定期检查Context
的Done
通道,以判断是否超时。
- 创建一个带有超时的
- 关键代码逻辑:
- 创建带超时的
Context
:使用context.WithTimeout
函数,它接受一个父Context
(通常是context.Background()
),以及一个超时时间。 - 在被调用函数中检查超时:通过
ctx.Done()
通道来判断是否收到取消信号,收到则表示超时或被取消。
- 创建带超时的
- 调用示例:
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
并处理可能的超时错误。