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

viggo
134 声望2 粉丝

热爱coding