Sobes.tech
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.