在Go中,協程的退出通常通過chan
實現。下面是一種常見的模式來實現阻塞的協程退出:
package main
import (
"fmt"
"time"
)
func worker(done chan bool) {
fmt.Println("協程開始執行...")
// 模擬耗時操作
time.Sleep(2 * time.Second)
fmt.Println("協程執行完畢!")
done <- true
}
func main() {
done := make(chan bool)
go worker(done)
// 阻塞等待協程完成
<-done
fmt.Println("主函數退出")
}
在上面的例子中,worker
函數是一個阻塞的協程,它執行一些耗時的操作。在worker
函數執行完畢后,通過將true
發送到done
通道來通知主函數協程的完成。主函數使用<-done
語法從通道中接收數據,從而阻塞等待協程的完成。一旦接收到數據,主函數就會繼續執行,打印"主函數退出"。
這種使用chan
來實現協程退出的模式非常常見,因為它提供了一種簡單而可靠的方式來同步協程的執行。