golang使用select-case条件语句的时候无法退出for循环

go启动协程做定时任务的时候常常会用到 for select case的场景,到了某个case 需要退出的时候新手常常犯错是使用了break,这个场景下break不能跳出任务,会一直继续执行,这个时候可以使用goto End 或者break BRK 带标签的跳出才能正常退出case;另外一个坑就是case选择的时候 如果两个条件同时满足的时候会随机执行一个,如果channel 不初始化 会永远阻塞,也会导致不能正常退出,下面贴出完整代码:

package main

import (
    "fmt"
    "sync"
    "time"
)

var stop chan int

func main() {
    var wg sync.WaitGroup
    fmt.Println(" now time is ", time.Now().Format(time.RFC3339))

    wg.Add(2)
    go func() {
        Dida()
        wg.Done()
    }()
   // 注意这里一定要初始化
    stop = make(chan int)
    go func() {
        time.Sleep(5 * time.Second)
        fmt.Println("after 5 second  ")
        stop <- 0
        wg.Done()
    }()
    wg.Wait()
    fmt.Println("now time is ", time.Now().Format(time.RFC3339))
}

func Dida() {
    t := time.Tick(1 * time.Second)
BRK:
    for {
        select {
        case <-t:
            fmt.Println("di .. ", time.Now().Format(time.RFC3339))
        case <-stop:
            fmt.Println("receive stop ")
            //goto End
            break BRK
        }
    }
    //End:
    fmt.Println("exit dida ... ")
}

本文链接:参与评论 »

--EOF--

提醒:本文最后更新于 490 天前,文中所描述的信息可能已发生改变,请谨慎使用。

Comments