【发布时间】:2018-04-30 18:58:02
【问题描述】:
我想使用多个 go 例程返回通道创建一个扇入函数,这是我的代码。
package main
import (
"fmt"
"math/rand"
"sync"
"time"
)
var wg, wg2 sync.WaitGroup
func main() {
final := talk(boring("Joe"), boring("Ann"))
for i := 0; i < 10; i++ {
fmt.Println(<-final)
}
fmt.Println("You are both boring I'm leaving")
}
func talk(input1, input2 <-chan string) <-chan string {
out := make(chan string)
go func() {
wg.Add(1)
for {
out <- <-input1
}
}()
go func() {
wg.Add(1)
for {
out <- <-input2
}
}()
wg.Done()
close(out)
return out
}
func boring(msg string) <-chan string {
c := make(chan string)
for i := 0; i < 5; i++ {
c <- fmt.Sprintf("%s%d\n", msg, i)
time.Sleep(time.Duration(rand.Intn(1e3)) * time.Millisecond)
}
return c
}
但是运行上面的代码后出现错误
所有 goroutine 都处于休眠状态 - 死锁
我已尝试关闭频道,但仍然出现错误。我试图将无聊的返回频道分配给乔和安,然后将这些频道传递给多路复用的通话功能,但仍然没有成功。我是新来的,学习渠道对这个概念不太清楚。
【问题讨论】:
标签: go