慕娘9325324
package mainimport ( "fmt" "math/rand" "time")func main() { a := make(chan int, 10) b := make(chan int, 10) c := make(chan string, 10) go func() { for { rand.Seed(time.Now().UnixNano()) a <- rand.Intn(101) time.Sleep(time.Millisecond * 100) } }() go func() { for { rand.Seed(time.Now().UnixNano()) b <- rand.Intn(101) time.Sleep(time.Millisecond * 300) } }() go func() { for { select { case ai := <-a: bi := <-b sum := ai + bi c <- fmt.Sprintf("%d + %d = %d", ai, bi, sum) } } }() sums := 0 for val := range c { if sums == 10 { close(c) close(b) close(a) } println(val) sums++ }}出于测试目的,我将秒更改为毫秒,而不是 100 个和,我验证了 10 个,但你明白了。额外信息:通道 A 和通道 B 必须缓冲 100 个项目。同样,出于测试目的,我在这里只放了 10 个。我时不时地收到死锁,我明白为什么。我的问题是,我不明白如何从接收通道关闭两个发送通道。任何人都可以解决这个谜团并向我解释一下。