Junior — Middle
Hogyan határozhatjuk meg, melyik goroutine fejezi be a munkát a csatornával?
sobes.tech MI
Válasz az MI-től
Go-ban nem lehet közvetlenül meghatározni, hogy melyik goroutine zárta be a csatornát, mivel a csatornák nem tartalmaznak információt arról, hogy ki zárta be őket. Azonban általában egy megállapodás szerint történik:
- Az a goroutine, amely ír a csatornába, felelős annak bezárásáért.
- A olvasó goroutine-ok a második paraméteren keresztül kapnak zárási jelet:
value, ok := <-ch. Haok == false, a csatorna zárva van.
Hogy megtudjuk, melyik goroutine zárta be a csatornát, további mechanizmusokat lehet használni, például strukturált üzenetek küldésével azonosítókkal a csatornán keresztül, vagy külön jelzőcsatornákat vagy kontextusokat (context.Context) alkalmazva a koordinációhoz.
Példa:
ch := make(chan int)
// Goroutine, amely ír és zár
go func() {
defer close(ch)
ch <- 1
}()
// Goroutine, amely olvas
go func() {
for v := range ch {
fmt.Println(v)
}
fmt.Println("Csatorna zárva")
}()
Ebben a példában az első goroutine zárja a csatornát. Hogy egyértelműen tudjuk, ki zárta be, hozzáadhatunk naplózást vagy további jelzőcsatornákat.