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)
}