golang select 退出结束goroutine
开启了多个协程 其中一个协程满足条件后终止select, 原以为其他的协程会在后台系统中继续悄悄运行 直到主进程关闭而关闭 。
做一实验发现select 监听退出 会关闭所有监听的goroutine
package main import ( "fmt" "time" ) var stop bool = false func main() { ch := make(chan int, 0) ch2 := make(chan int, 0) defer func() { close(ch) close(ch2) }() go func() { ch <- 1 }() for i := 0; i <= 20; i++ { go func(ch2 chan int) { for { fmt.Println(time.Now().Unix()) ch2 <- 1 if stop { fmt.Println("sqlpop stop") return } } }(ch2) } L: for { select { case m := <-ch: fmt.Println(m) stop = true time.Sleep(time.Second * 2) break L case <-ch2: } } time.Sleep(time.Second * 10) }
输出
/data/GoPro/src/test/test [/data/GoPro/src/test] 1421401239 1421401239 1421401239 1421401239 1421401239 1421401239 1421401239 1421401239 1421401239 1421401239 1421401239 1421401239 1421401239 1 成功: 进程退出代码 0.
原以为输出1后回继续打印时间 但实际select退出后 其余的协程也退出了 不会一直打印直到主进程退出
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
【推荐】AI 的力量,开发者的翅膀:欢迎使用 AI 原生开发工具 TRAE
【推荐】2025 HarmonyOS 鸿蒙创新赛正式启动,百万大奖等你挑战
【推荐】博客园的心动:当一群程序员决定开源共建一个真诚相亲平台