Junior
Jaký je rozdíl mezi bufferovanými a nebufferovanými kanály v Go?
sobes.tech AI
Odpověď od AI
Kanály bez bufferu vyžadují, aby odesílání a přijímání dat probíhalo synchronně. Odesílatel je zablokován, dokud není příjemce připraven přijmout data, a naopak. Jejich velikost bufferu je nula.
Bufferované kanály mají konečnou velikost bufferu. Odesílatel je zablokován pouze v případě, že je buffer plný, a příjemce, pokud je buffer prázdný.
// Kanál bez bufferu
unbufferedChan := make(chan int)
// Bufferovaný kanál s velikostí bufferu 5
bufferedChan := make(chan int, 5)
| Charakteristika | Kanál bez bufferu | Bufferovaný kanál |
|---|---|---|
| Velikost bufferu | 0 | > 0 |
| Synchronizace | Synchronous interaction | Asynchronní, pokud buffer není plný/prázdný |
| Blokování odesílatele | Do doby, než příjemce přijme | Do doby, než se buffer naplní |
| Blokování příjemce | Do doby, než odešle odesílatel | Do doby, než se buffer vyprázdní |
Kanály bez bufferu se používají ke synchronizaci gorutin a zajištění, že zprávy nezmizí. Bufferované kanály se používají ke snížení blokování, umožňující odesílateli pokračovat v práci, zatímco příjemce ještě není připraven, nebo naopak.