Junior — Middle
Ako určiť, ktorá gorutina ukončí prácu s kanálom?
sobes.tech AI
Odpoveď od AI
V Go nie je možné priamo určiť, ktorá gorutina zatvorila kanál, pretože kanály neobsahujú informácie o tom, kto ich zatvoril. Avšak, zvyčajne sa používa dohoda:
- Gorutina, ktorá zapisuje do kanála, je zodpovedná za jeho zatvorenie.
- Čítajúce gorutiny dostávajú signál o zatvorení prostredníctvom druhého parametra pri čítaní:
value, ok := <-ch. Akok == false, kanál je zatvorený.
Aby ste zistili, ktorá gorutina zatvorila kanál, môžete použiť ďalšie mechanizmy, ako je odosielanie štruktúrovaných správ s identifikátormi cez kanál alebo použitie samostatných signálnych kanálov alebo kontextov (context.Context) na koordináciu.
Príklad:
ch := make(chan int)
// Gorutina, ktorá zapisuje a zatvára kanál
go func() {
defer close(ch)
ch <- 1
}()
// Gorutina, ktorá číta
go func() {
for v := range ch {
fmt.Println(v)
}
fmt.Println("Kanal zatvorený")
}()
V tomto príklade zatvára kanál prvá gorutina. Aby ste jasne vedeli, kto ho zatvoril, môžete pridať logovanie alebo použiť ďalšie signálne kanály.