今天遇到一个小坑,就是在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
···
//死循环
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。