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