Опробование диапазона и закрытия на go канале - PullRequest
0 голосов
/ 30 марта 2020

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

После выполнения кода ниже я получаю сообщение об ошибке, указанное ниже кода.

Код:

package main

import (
    "fmt"
)

func main() {
    str := "hello"
    hiChannel := make(chan string, 5)
    for j := 1; j <= 5; j++ {
        go func(hi string) {
            hiChannel <- hi
        }(str)
    }
    defer close(hiChannel)
    for s := range hiChannel {
        fmt.Println(s)
    }
}

Ошибка:

go run restsample/restsample.go
hello
hello
hello
hello
hello
fatal error: all goroutines are asleep - deadlock!

goroutine 1 [chan receive]:
main.main()
        C:/Users/Indian/personal/Workspaces/Learning/src/restsample/restsample.go:16 +0x169
exit status 2

Ответы [ 2 ]

2 голосов
/ 30 марта 2020
for s := range hiChannel

Оператор for завершается, когда вы закрываете hiChannel, фактически вы не закрываете канал, поэтому ваш код вызывает тупик.
Существует несколько способов закрыть канал, например, вы можете посчитать, сколько строк вы напечатали, а затем можете закрыть канал.
Или вы можете создать канал сигнала и закрыть, когда вы получили всю необходимую информацию.

0 голосов
/ 30 марта 2020

На основе отзывов @Tinwor я попытался добавить несколько строк, чтобы проверить количество сообщений, и это сработало. Спасибо.

package main

import (
    "fmt"
)

func main() {
    str := "hello"
    hiChannel := make(chan string, 5)
    for j := 1; j <= 5; j++ {
        go func(hi string) {
            hiChannel <- hi
        }(str)
    }
    i := 1
    for s := range hiChannel {
        i++
        if i == 5 {
            fmt.Println(s)
            close(hiChannel)
        } else {
            fmt.Println(s)
        }
    }
}
...