Junior — Middle
Tudna példát adni arra, hogyan lehet módszereket alkalmazni csatornákkal goroutine-ok használata nélkül?
sobes.tech MI
Válasz az MI-től
A Go nyilak általában a goroutine-ok közötti kommunikációra szolgálnak, de használhatók további goroutine-ok indítása nélkül is, például szinkron adatátvitelhez.
Példa:
package main
import "fmt"
func main() {
ch := make(chan int)
// Küldés és fogadás egy szálon (goroutine nélkül)
go func() {
ch <- 42
}()
val := <-ch
fmt.Println(val)
}
Azonban ebben a példában egy goroutine-ot használnak a küldéshez, hogy elkerüljék a blokkolást. Ha egyáltalán nem használnánk goroutine-okat, a küldés és fogadás szekvenciálisan kell, hogy történjen, például:
package main
import "fmt"
func main() {
ch := make(chan int, 1) // Bufferelt csatorna
ch <- 10 // Küldés a bufferelt csatornába
val := <-ch // Fogadás a csatornából
fmt.Println(val)
}
Itt a bufferelt csatorna lehetővé teszi érték küldését blokkolás nélkül, mivel van hely a bufferben. Ezért a bufferelt csatornákkal és szekvenciális küldéssel/fogadással goroutine-okat nélkülöző módszerek is lehetségesek.