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 για την παρακολούθηση του κλεισίματος όλων των καναλιών και στην εκκίνηση goroutines για την ανάγνωση από κάθε κανάλι.

Παράδειγμα υλοποίησης:

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 αφού ολοκληρωθούν όλες οι goroutines
    go func() {
        wg.Wait()
        close(out)
    }()

    return out
}

Αυτή η προσέγγιση διασφαλίζει ότι όλες οι τιμές από τα εισερχόμενα κανάλια φτάνουν στο κανάλι εξόδου, και ότι το κανάλι εξόδου κλείνει μετά το κλείσιμο όλων των εισερχόμενων καναλιών.