Junior — Middle
Kuidas määrata, milline goroutine lõpetab töö kanaliga?
sobes.tech AI
Vastus AI-lt
Go keeles ei ole otseselt võimalik määrata, milline gorutina sulges kanali, kuna kanalid ei sisalda teavet selle kohta, kes need sulges. Kuid tavaliselt kasutatakse järgmist kokkulepet:
- Gorutina, kes kirjutab kanalisse, vastutab selle sulgemise eest.
- Loetavad gorutinaid saavad sulgemissignaali teise parameetri kaudu lugedes:
value, ok := <-ch. Kuiok == false, on kanal suletud.
Selleks, et teada saada, milline gorutina sulges kanali, saab kasutada täiendavaid mehhanisme, näiteks saata struktureeritud sõnumeid identifikaatoritega kanali kaudu või kasutada eraldi signaalikanaleid või kontekste (context.Context) koordineerimiseks.
Näide:
ch := make(chan int)
// Gorutina, mis kirjutab ja sulgeb kanali
go func() {
defer close(ch)
ch <- 1
}()
// Gorutina, mis loeb
go func() {
for v := range ch {
fmt.Println(v)
}
fmt.Println("Kanal on suletud")
}()
Selles näites sulgeb esimene gorutina kanali. Selleks, et teada saada täpselt, kes selle sulges, saab lisada logimise või kasutada täiendavaid signaalikanaleid.