как решить проблему с закрытием чана в golang - PullRequest
0 голосов
/ 02 августа 2020

Необходимо написать функцию, которая удаляет дубликаты, но я получаю сообщение об ошибке, в чем может быть проблема

func remDup(in, out chan string) {
 for {
     val, ok := <-in
     if ok == false {
         break
     } else {
         if val != <-out{
             out <- val
         }
     }
 }
 close(out)
}


:fatal error: all goroutines are asleep - deadlock!

1 Ответ

1 голос
/ 02 августа 2020

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

out := make(chan string)

Это поведение хорошо объяснено в спецификациях канала :

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

А также от эффективного Go канала

Если канал не буферизован, отправитель блокируется до тех пор, пока получатель не получит значение

Если вы хотите, чтобы получатель ждал каких-либо данных из канала, и вы не знаете, отправил ли отправитель данные в канал или нет, используйте буферный канал .

out := make(chan string, 100)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...