Sobes.tech
Junior — Middle

Jak zachowuje się program podczas korzystania z range do odczytu z zamkniętego, niebuforowanego kanału?

sobes.tech AI

Odpowiedź od AI

Używając range do odczytu z kanału w Go, pętla będzie otrzymywać wartości z kanału do momentu jego zamknięcia. Jeśli kanał jest zamknięty i wszystkie wartości zostały odczytane, range zakończy pętlę.

Dla niebuforowanego kanału działa to tak samo jak dla buforowanego: jeśli kanał jest zamknięty, range nie blokuje się i wychodzi z pętli.

Przykład:

ch := make(chan int)
func() {
    ch <- 1
    ch <- 2
    close(ch)
}()

for v := range ch {
    fmt.Println(v) // Wypisze 1 i 2, potem pętla się zakończy
}

Jeśli kanał jest zamknięty, ale nie zawiera danych, range zakończy się natychmiast. Jeśli kanał nie jest zamknięty, ale nie ma danych, range będzie czekać (zablokuje się) do pojawienia się danych lub zamknięcia kanału.