Sobes.tech
Senior

Que se passe-t-il lors de la lecture à partir d'un canal fermé ? Pourquoi le programme se bloque-t-il dans une boucle infinie lors de la lecture d'un canal fermé sans utiliser range ?

sobes.tech IA

Réponse de l'IA

При чтении из закрытого канала в Go операция чтения возвращает нулевое значение типа канала и флаг, указывающий, что канал закрыт. Если читать из канала с помощью конструкции value, ok := <-ch, то при закрытии канала ok станет false, и можно корректно обработать окончание данных.

Если же читать из канала в бесконечном цикле без проверки ok (например, for { v := <-ch }), то после закрытия канала чтение будет возвращать нулевое значение, но не блокироваться. Однако, если канал закрыт и в нем нет данных, чтение из него сразу возвращает нулевое значение, и цикл может продолжать выполняться бесконечно, если нет условия выхода.

При использовании range по каналу цикл автоматически завершается, когда канал закрывается и все данные прочитаны, что предотвращает зависание.

Пример правильного чтения:

for v := range ch {
    fmt.Println(v)
}
// Цикл завершится, когда канал будет закрыт

Пример с проверкой ok:

for {
    v, ok := <-ch
    if !ok {
        break // канал закрыт
    }
    fmt.Println(v)
}