Junior — Middle
Za jakých podmínek dochází k blokování při práci se standardním kanálem přenosu dat?
sobes.tech AI
Odpověď od AI
V Go je standardní kanál pro přenos dat blokován v následujících případech:
- Při odesílání hodnoty do kanálu (
chan <- value), pokud kanál nemá buffer nebo je plný, blokuje se odesílající gorutina, dokud jiný vlákno ne přečte hodnotu. - Při čtení z kanálu (
value := <- chan), pokud je kanál prázdný, blokuje se čtoucí gorutina, dokud se neobjeví data.
Tímto způsobem dochází k blokování při pokusu o odeslání dat do plného kanálu nebo odeslání z prázdného kanálu, což zajišťuje synchronizaci mezi gorutinami.
Příklad:
ch := make(chan int) // kanál bez bufferu
// Odeslání se blokuje, dokud někdo ne přečte
go func() {
ch <- 42
}()
hodnota := <-ch // čtení odemyká odeslání
fmt.Println(hodnota)