一种可能的解决方案是避免使用select语句,并为接收者(或发送者,或两者)使用单独的goroutine。例:
package main import "sync"func worker(res chan bool, wg *sync.WaitGroup) { res <- true wg.Done()}func receiver(res chan bool, wg *sync.WaitGroup) { for range res { } wg.Done()}func main() { var wg, wg2 sync.WaitGroup wg.Add(1) wg2.Add(10) found := make(chan bool) go receiver(found, &wg) for i := 0; i < 10; i++ { go worker(found, &wg2) } wg2.Wait() close(found) wg.Done()}


