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退出后 其余的协程也退出了 不会一直打印直到主进程退出
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?