Sobes.tech
Junior — Middle

Hogyan lehet meghatározni, hogy minden csatorna zárva van a Main módszerből?

sobes.tech MI

Válasz az MI-től

Go nyelvben többféleképpen lehet meghatározni, hogy az összes csatorna lezárult a main metódusból, a kontextustól függően:

  1. Egy csatorna használata a befejezés jelzésére — például, egy külön csatorna lezárása, amikor minden munkáért felelős goroutine befejeződött.

  2. A csatorna lezárásának ellenőrzése olvasás közben — olvasáskor a v, ok := <-ch operátor ok == false értéket ad vissza, ha a csatorna lezárult és minden adat olvasva lett.

  3. sync.WaitGroup használata, hogy várjunk minden, a csatornába író goroutine befejeződésére, majd a main-ben lezárjuk a csatornát a befejeződésük után.

Példa WaitGroup-gal:

var wg sync.WaitGroup
ch := make(chan int)

wg.Add(1)
go func() {
    defer wg.Done()
    // munka a csatornával
    ch <- 1
}()

// Egy külön goroutine-ban lezárjuk a csatornát, miután minden küldő befejezte
go func() {
    wg.Wait()
    close(ch)
}()

for v := range ch {
    fmt.Println(v) // a ciklus akkor ér véget, amikor a csatorna lezárul
}

Így a main-ben meghatározható, hogy a csatorna lezárult, amikor a rá épülő ciklus befejeződik, ami azt jelzi, hogy minden adat elküldésre került és a csatorna lezárult.