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"