关于golang:go语言for循环中的break

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

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理