Junior — Middle
Jak určit, která gorutina ukončí práci s kanálem?
sobes.tech AI
Odpověď od AI
V Go nelze přímo určit, která gorutina ukončila kanál, protože kanály neobsahují informace o tom, kdo je uzavřel. Obvykle se však používá dohoda:
- Gorutina, která zapisuje do kanálu, je za jeho uzavření odpovědná.
- Čtoucí gorutiny dostávají signál o uzavření přes druhý parametr při čtení:
value, ok := <-ch. Pokudok == false, je kanál uzavřen.
Pro zjištění, která gorutina kanál uzavřela, lze použít další mechanismy, například posílat strukturované zprávy s identifikátory přes kanál nebo používat samostatné signální kanály či kontexty (context.Context) pro koordinaci.
Příklad:
ch := make(chan int)
// Gorutina, která zapisuje a uzavírá kanál
go func() {
defer close(ch)
ch <- 1
}()
// Gorutina, která čte
go func() {
for v := range ch {
fmt.Println(v)
}
fmt.Println("Kanál uzavřen")
}()
V tomto příkladu uzavírá kanál první gorutina. Abychom věděli přesně, kdo kanál uzavřel, můžeme přidat logování nebo použít další signální kanály.