方式一
package main import ( "fmt" ) func main() { ch := make(chan struct{}) count := 2 // count 表示活動的協程個數 go func() { fmt.Println("Goroutine 1") ch <- struct{}{} // 協程結束,發出信號 }() go func() { fmt.Println("Goroutine 2") ch <- struct{}{} // 協程結束,發出信號 }() for range ch { // 每次從ch中接收數據,表明一個活動的協程結束 count-- // 當所有活動的協程都結束時,關閉管道 if count == 0 { close(ch) } } }
方式二
package main import ( "fmt" "sync" ) func main() { var wg sync.WaitGroup wg.Add(2) // 因為有兩個動作,所以增加2個計數 go func() { fmt.Println("Goroutine 1") wg.Done() // 操作完成,減少一個計數 }() go func() { fmt.Println("Goroutine 2") wg.Done() // 操作完成,減少一個計數 }() wg.Wait() // 等待,直到計數為0 }