Sobes.tech
Junior — Middle

Jak zastavit běh gorutiny, pokud očekávaná hodnota ještě nebyla dosažena?

sobes.tech AI

Odpověď od AI

V jazyce Go se k gorutině, která čeká na hodnotu, ale tato hodnota může nepřijít, obvykle používají kanály s časovým limitem nebo kontext s možností zrušení.

Příklad s časovým limitem pomocí select a time.After:

select {
case val := <-ch:
    // hodnota přijata, pokračujeme v práci
case <-time.After(time.Second * 5):
    // časový limit vypršel, ukončíme gorutinu
}

Další způsob je použití kontextu (context.Context), který lze zvenčí zrušit:

ctx, cancel := context.WithCancel(context.Background())

go func() {
    select {
    case val := <-ch:
        // zpracovat val
    case <-ctx.Done():
        // ukončit gorutinu
    }
}()

// někde v kódu zavoláme cancel(), aby se gorutina ukončila

Tímto způsobem gorutina nebude čekat nekonečně a může být správně ukončena.