context.Context
你有一个循环,它无条件地迭代10次,然后打印一些东西。并且您只需在循环后检查超时。
您必须将上下文检查移动到循环中:
func F(ctx context.Context) error {
ctx, cancel := context.WithTimeout(ctx, 3*time.Second)
defer cancel()
for i := 0; i < 10; i++ {
select {
case <-ctx.Done():
fmt.Println("TIME OUT")
return ctx.Err()
default:
time.Sleep(1 * time.Second)
fmt.Println("No: ", i)
}
}
fmt.Println("ALL DONE")
return nil
}
进行此更改后,输出将为(在Go Playground上试用):
No: 0
No: 1
No: 2
No: 3
TIME OUT
context deadline exceeded
"No: 3""No: 3"