我试图编写这样的函数,但我无法声明切片通道
func fanIn(set <-[]chan string) <-chan string {
c := make(chan string)
for i := range set {
go func() { for {c <-set[i]} }()
}
return c
}
是否可以在Go中将一片频道作为参数?
电话
的例子set := [2]chan string{mylib.Boring("Joe"), mylib.Boring("Ann")}
c := fanIn(set)
如果我能做到这一点
func fanIn(input1, input2 <-chan string) <-chan string {
我认为应该可以使用&#34;&lt; -chan string&#34;
的切片或数组更新
func fanIn(set []<-chan string) <-chan string {
c := make(chan string)
for i := range set {
go func() {
for {
x := <-set[i]
c <- x
}
}()
}
return c
}
func main() {
set := []<-chan string{mylib.Boring("Joe"), mylib.Boring("Ann"), mylib.Boring("Max")}
c := fanIn(set)
for i := 0; i < 10; i++ {
fmt.Println(<-c)
}
fmt.Println("You're boring: I'm leaving.")
}
答案 0 :(得分:4)
我修改了函数中的语法,它现在编译:
func fanIn(set []<-chan string) <-chan string {
c := make(chan string)
for i := range set {
// here is the main change - you receive from one channel and send to one.
// the way you wrote it, you're sending the channel itself to the other channel
go func() { for {c <- <- set[i]} }()
}
return c
}
为了便于阅读,我想把它写成:
go func() {
for {
x := <-set[i]
c <- x
}
}()
编辑:您的原始代码存在在goroutine中使用set[i]
的问题,导致它们全部从最后一个通道读取。这是固定版本:
func fanIn(set []<-chan string) <-chan string {
c := make(chan string)
for i := range set {
go func(in <-chan string) {
for {
x := <- in
c <- x
}
}(set[i])
}
return c
}