go语言for循环中的break

530 阅读1分钟

今天遇到一个小坑,就是在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
··· 
死循环