我想利用 golang 中的上下文在超时时用于取消。


编码:


package main


import "fmt"

import "time"

import "context"


func F(ctx context.Context) error {

  ctx, cancel := context.WithTimeout(ctx,3*time.Second)

  defer cancel()

  for i:=0;i<10;i++ {

    time.Sleep(1 * time.Second)

    fmt.Println("No: ",i)

  }

  select {

    case <-ctx.Done():

      fmt.Println("TIME OUT")

      cancel()

      return ctx.Err()

    default:

      fmt.Println("ALL DONE")

      return nil

  }

}


func main() {

  ctx := context.Background()

  err := F(ctx)

  if err != nil {

    fmt.Println(err)

  }else {

    fmt.Println("Success")

  }

}

期望:上面的代码应该在 counter 停止运行循环2,因为超时是 3 秒,循环运行 1 秒。所以我期待这样的事情:


No:  0

No:  1

No:  2

TIME OUT

context deadline exceeded

实际:实际发生的情况是循环继续运行直到完成,即使上下文遇到超时并且选择侦听器在<-ctx.Done(). 此代码打印:


No:  0

No:  1

No:  2

No:  3

No:  4

No:  5

No:  6

No:  7

No:  8

No:  9

TIME OUT

context deadline exceeded

超时满足后如何停止函数执行?