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 ... ")
}
本文链接:https://iokde.com/post/go-select-case-break-for-loop.html,参与评论 »
--EOF--
发表于 2023-01-30 17:40:56,并被添加「golang」标签。
本站使用「署名 4.0 国际」创作共享协议,转载请注明作者及原网址。tools更多说明 »
提醒:本文最后更新于 490 天前,文中所描述的信息可能已发生改变,请谨慎使用。
Comments