1 回答
TA贡献1783条经验 获得超4个赞
package main
import (
"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 个。
我时不时地收到死锁,我明白为什么。我的问题是,我不明白如何从接收通道关闭两个发送通道。任何人都可以解决这个谜团并向我解释一下。
- 1 回答
- 0 关注
- 60 浏览
添加回答
举报