Диапазон по массиву каналов - PullRequest
0 голосов
/ 22 января 2020

Я могу варьироваться по каналу, чтобы получить значение из него, но когда я пытаюсь прочитать из массива каналов, это выдает мне ошибку.

Все, что я делаю, это создание массива канала, который содержит 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)
        }
    }
}

но это дает мне эту ошибку:

фатальная ошибка: все программы находятся в спящем режиме - тупик!

режим 1 [канал получен (ноль чан)]: главный. main ()

1 Ответ

0 голосов
/ 22 января 2020

Это потому, что вы сначала создаете два канала без буферизации и без значений. Затем вы добавляете два канала с буферизацией и значениями.

Когда вы выбираете диапазон каналов, вы читаете с первого пустого канала, и это навсегда блокируется.

EDIT

Вот очищенный код :

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
...