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.