想象一下一个具有两步过程的goroutine,其中主线程需要在每一步之间做一些工作:
func main() { ch := make(chan struct{}) go func() { // 等待主线程的信号开始第一步 <-ch // 执行工作 time.Sleep(1 * time.Second) // 向主线程发出第一步已完成的信号 ch <- struct{}{} // 等待主线程的信号开始第二步 <-ch // 执行工作 time.Sleep(1 * time.Second) // 向主线程发出工作已完成的信号 ch <- struct{}{} }() // 通知goroutine第一步可以开始 ch <- struct{}{} // 等待goroutine通知第一步已完成 <-ch // 在通知之前执行一些工作 // 第二步可以开始的程序 time.Sleep(1 * time.Second) // 通知goroutine第二步可以开始 ch <- struct{}{} // 等待goroutine通知第二步已完成 <-ch }