Senior
Jaké typy kanálů existují v Go a k čemu každý slouží?
sobes.tech AI
Odpověď od AI
V jazyce Go existují dva hlavní typy kanálů:
-
Vyrovnané kanály (buffered channels) — mají interní vyrovnávací paměť pevné velikosti. Odesílatel může zapisovat do kanálu několik hodnot bez blokování, dokud se buffer nezaplní. Používají se pro asynchronní přenos dat a vyhlazování špiček zátěže.
-
Nevyrovnané kanály (unbuffered channels) — nemají buffer. Odesílatel je blokován, dokud příjemce ne přečte hodnotu. Používají se pro synchronizaci a přenos dat mezi gorutinami v okamžiku přenosu.
Příklad vytvoření a použití vyrovnaného kanálu:
ch := make(chan int, 3) // buffer o velikosti 3
ch <- 1
ch <- 2
ch <- 3 // neblokuje, protože buffer není plný
fmt.Println(<-ch) // 1
Pro nevyrovnaný kanál:
ch := make(chan int) // bez bufferu
// v samostatné gorutině
go func() {
ch <- 42 // blokuje, dokud někdo ne přečte
}()
Hodnota := <-ch // čtení odblokuje odesílatele
fmt.Println(Hodnota) // 42
Kanály mohou být také jednosměrné (pouze pro odesílání nebo pouze pro příjem), což pomáhá jasně uvést záměry v kódu.