以下代码,逻辑上的执行结果 应该是:
1
2
3
...
exit...
但是名实际上是:
1
exit...
为什么会这样呢
14 ctx := context.Background()
15 ctx1, cannel := context.WithTimeout(ctx, times)
16
17 go func(ctx context.Context) {
18 count := 1
19 for {
20 select {
21 case <-ctx.Done():
22 fmt.Println("exit....")
23 return
24 default:
25 fmt.Println(count)
26 count++
27 time.Sleep(times * 10)
28 }
29 }
30 }(ctx1)
31
32 time.Sleep(time.Second * 3)
33 cannel()
```go
package main
import (
"context"
"fmt"
"time"
)
func main() {
done := make(chan struct{})
ctx, cancel := context.WithCancel(context.Background())
go func() {
count := 1
for {
select {
case <-ctx.Done():
fmt.Println("exit...")
done <- struct{}{}
return
default:
fmt.Println(count)
count++
time.Sleep(1 * time.Second)
}
}
}()
time.Sleep(3 * time.Second)
cancel()
<-done
}
```
#6
更多评论
你代码 `times` 变量是多久?`<-ctx.Done():` 是接收超时的信号; 但是你的 `default: time.Sleep(times * 10)` 阻塞住代码了,正常只会输出 1 然后超时退出了。
#2