Sobes.tech
Senior

// 2 func merge(chans ...chan int) <-chan int { panic("not implemented") } func main() { a,b,c := make(chan int), make(chan int), make(chan int) out := merge(a,b,c) go func(){ for v := range out { println(v) } }() a <- 1 a <- 2 a <- 3 b <- 4 c <- 5 close(c) a <- 6 } Реализирайте функцията merge, която приема множество канали за цели числа и връща един канал, който обединява стойностите от всички входни канали. Обединеният канал трябва да се затвори, когато всички входни канали са затворени.

sobes.tech AI

Պատասխան AI-ից

merge գործառույթը պետք է ընդունի մի քանի chan int ալիքներ և վերադարձնի մեկ ալիք, որի մեջ կուղարկվեն բոլոր մուտքային ալիքների արժեքները: Երբ բոլոր մուտքային ալիքները փակվեն, նաև ելքային ալիքն պետք է փակվի:

Ընդհանուր առմամբ, այս գործառույթը հիմնված է sync.WaitGroup-ի օգտագործման վրա՝ բոլոր ալիքների փակման հետևելու և յուրաքանչյուր ալիքից ընթերցելու համար goroutine-ներ գործարկելու վրա:

Նմուշային իրականացում:

func merge(chans ...chan int) <-chan int {
    var wg sync.WaitGroup
    out := make(chan int)

    // Ֆունկցիա՝ արժեքները պատճենելու մեկ ալիքից դեպի out
    output := func(c chan int) {
        defer wg.Done()
        for v := range c {
            out <- v
        }
    }

    wg.Add(len(chans))
    for _, c := range chans {
        go output(c)
    }

    // out-ը փակվում է բոլոր goroutine-ները ավարտելուց հետո
    go func() {
        wg.Wait()
        close(out)
    }()

    return out
}

Այս մոտեցումը ապահովում է, որ բոլոր մուտքային ալիքների արժեքները հասնեն ելքային ալիքին, և ելքային ալիքն փակվի բոլոր մուտքային ալիքների փակվելուց հետո։