Sobes.tech
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.