package main import ( "fmt" "time" ) func main() { N := 5 exit := make(chan struct{}) done := make(chan struct{}, N) // start N worker goroutines for i := 0; i < N; i++ { go func(n int) { for { select { // wait for exit signal case x := <-exit: fmt.Printf("worker goroutine #%d exit\n", n) fmt.Printf("worker goroutine #%d exit\n", x) done <- struct{}{} return case <-time.After(time.Second): fmt.Printf("worker goroutine #%d is working...\n", n) } } }(i) } close(exit) //关闭exit会导致N个goroutine都会收到关闭的信号 time.Sleep(5 * time.Second) // broadcast exit signal //close(exit) // wait for all worker goroutines exit //for i := 0; i < N; i++ { // <-done //} fmt.Println("main goroutine exit") } //结果: //worker goroutine #4 exit //worker goroutine #{} exit //worker goroutine #2 exit //worker goroutine #{} exit //worker goroutine #3 exit //worker goroutine #{} exit //worker goroutine #1 exit //worker goroutine #{} exit //worker goroutine #0 exit //worker goroutine #{} exit //main goroutine exit //Process finished with the exit code 0