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

  1. 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.

  2. 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.