Sobes.tech
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. Pokud ok == 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.