Sobes.tech
Junior — Middle

Kako odrediti koja od gorutina će završiti rad sa kanalom?

sobes.tech АИ

Одговор од АИ

U Go, nije moguće direktno odrediti koja gorutina je zatvorila kanal, jer kanali ne sadrže informacije o tome ko ih zatvara. Međutim, obično se koristi sledeći dogovor:

  • Gorutina koja piše u kanal je odgovorna za njegovo zatvaranje.
  • Čitajuće gorutine dobijaju signal zatvaranja putem drugog parametra pri čitanju: value, ok := <-ch. Ako je ok == false, kanal je zatvoren.

Da biste saznali koja gorutina je zatvorila kanal, možete koristiti dodatne mehanizme, kao što su slanje strukturiranih poruka sa identifikatorima putem kanala ili korišćenje odvojenih signala kanala ili konteksta (context.Context) za koordinaciju.

Primer:

ch := make(chan int)

// Gorutina koja piše i zatvara kanal
go func() {
    defer close(ch)
    ch <- 1
}()

// Gorutina koja čita
go func() {
    for v := range ch {
        fmt.Println(v)
    }
    fmt.Println("Kanal zatvoren")
}()

U ovom primeru, prva gorutina zatvara kanal. Da biste jasno znali ko je zatvorio kanal, možete dodati logovanje ili koristiti dodatne signale kanala.