1 回答

TA貢獻1783條經(jīng)驗 獲得超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 個。
我時不時地收到死鎖,我明白為什么。我的問題是,我不明白如何從接收通道關閉兩個發(fā)送通道。任何人都可以解決這個謎團并向我解釋一下。
- 1 回答
- 0 關注
- 84 瀏覽
添加回答
舉報