通道数组的范围

Range over array of channel

我可以跨通道范围以从中获取值,但是当我尝试从通道数组中读取时出现错误。

我所做的就是创建包含 2 个通道的通道数组,第一个包含 1 到 5 的值,第二个包含 6 到 10 的值,我只想从通道数组中读取值本身。

这是我的代码:

package main

import "fmt"

func main() {
    channelList := make([]chan int, 2)
    for i := 0; i < 1; i++ {
        channelList = append(channelList, make(chan int))
    }

    FChannel := make(chan int, 5)
    for i := 1; i <= 5; i++ {
        FChannel <- i // contain values from 1 to 5
    }
    close(FChannel)
    channelList = append(channelList, FChannel)

    SChannel := make(chan int, 5)
    for j := 6; j <= 10; j++ {
        SChannel <- j // contain values from 6 to 10
    }
    close(SChannel)
    channelList = append(channelList, SChannel)

    for _, c := range channelList {
        for range c {
            fmt.Println(<-c)
        }
    }
}

但它给了我这个错误:

fatal error: all goroutines are asleep - deadlock!

goroutine 1 [chan receive (nil chan)]: main.main()

这是因为您首先创建了两个没有缓冲且没有值的通道。然后,您附加两个带有缓冲和值的通道。

当您跨越频道时,您会从第一个空频道读取数据,这将永远阻塞。

编辑

这是清理后的代码:

package main

import "fmt"

func main() {
    channelList := make([]chan int, 0, 2)

    FChannel := make(chan int, 5)
    for i := 1; i <= 5; i++ {
        FChannel <- i // contain values from 1 to 5
    }
    close(FChannel)
    channelList = append(channelList, FChannel)

    SChannel := make(chan int, 5)
    for j := 6; j <= 10; j++ {
        SChannel <- j // contain values from 6 to 10
    }
    close(SChannel)
    channelList = append(channelList, SChannel)

    for _, c := range channelList {
        for v := range c {
            fmt.Println(v)
        }
    }
}

我得到的输出是

1
2
3
4
5
6
7
8
9
10