ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、视频、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## 并发的退出 1. 因为在golang中是无法在一个协程中终止另一个协程的. 2. 接收一个未close且len()为0的channel是会阻塞的. 3. 但是接收一个已close且len()为0的channel会立刻返回该channel类型的零值.这样,我们就可以利用关闭一个channel来广播通知其他协程进行退出了. ~~~ signal := make(chan int) //声明一个退出信号 for i := 0; i < 10; i++ { n := i go func() { fmt.Println(n) //do something for { select { case <-signal: //当未关闭signal的时候,这里永远是阻塞的,那么永远会执行default.但是当关闭了signal的时候,这里会接收到一个零值,此时触发return从而退出协程. fmt.Println("退出啦", n) return default: } } }() } time.Sleep(3 * time.Second) //等待,用来观察被启动的协程 close(signal) //关闭channel fmt.Println("done") time.Sleep(3 * time.Second) //等待,用来观察协程是否退出,否则主程序一退出,协程自动退出了 ~~~