Priorität in der Go select-Anweisung Abhilfe

Wünsche ich mir eine go-routine hören auf beiden Kanälen blockiert, wenn beide Kanäle entwässert werden. Allerdings, wenn beide Kanäle die Daten enthält, möchte ich einen abgelassen werden, bevor die anderen behandelt wird.

Im Beispiel unten ich wünschte, alle out abgelassen werden, bevor exit behandelt wird. Ich benutze eine select-Anweisung, die keine Reihenfolge der Priorität. Wie könnte ich umgehen das problem, dass alle 10-Werte behandelt werden, bevor die Ausfahrt?

package main

import "fmt"

func sender(out chan int, exit chan bool){
    for i := 1; i <= 10; i++ {
        out <- i
    } 
    exit <- true
}

func main(){
    out := make(chan int, 10)
    exit := make(chan bool)

    go sender(out, exit)

    L:
    for {
        select {
            case i := <-out:
                fmt.Printf("Value: %d\n", i)
            case <-exit:
                fmt.Println("Exiting")
                break L
        }
    }
    fmt.Println("Did we get all 10? Most likely not")
}
  • Für das Beispiel, das Sie Gaben, brauchen Sie nur den out-Kanal und schließen Sie es nach dem senden abgeschlossen ist.
InformationsquelleAutor ANisus | 2012-06-20
Schreibe einen Kommentar