明天遇到一个小坑,就是在 for 包裹的 select 中应用 break,只会跳出 select,不会跳出 for 循环,case 如下:
func main() {cxt,cancel := context.WithCancel(context.Background())
var wg sync.WaitGroup
wg.Add(1)
go func() {defer wg.Done()
for {
select {case <-cxt.Done():
time.Sleep(time.Second)
fmt.Println("it cancel")
break
// 只会跳出 select 不会跳出 for 循环
// 在这里能够间接 return
// 或者配合 label 标签推出循环
default:
fmt.Println("Go go go")
time.Sleep(time.Second)
}
}
}()
time.Sleep(1500*time.Millisecond)
cancel()
wg.Wait()}
输入
Go go go
Go go go
it cancel
it cancel
it cancel
it cancel
it cancel
···
// 死循环