Desidero eseguire una routine di routine su due canali, bloccati quando entrambi i canali sono vuoti. Tuttavia, se entrambi i canali contengono dati, voglio che uno sia svuotato prima che l'altro sia gestito.Priorità nella selezione di selezione Vai soluzione alternativa
Nell'esempio di lavoro in basso desidero scaricare tutto lo out
prima che venga gestito exit
. Io uso uno-select
-statement che non ha alcun ordine di priorità. Come posso aggirare il problema, facendo sì che tutti i 10 valori in uscita vengano gestiti prima dell'uscita?
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")
}
L'idea è molto simile alla mia. Ma è vero, con l'istruzione 'continue', ti libererai della necessità di una bandiera. Inteligente. Bene, questa è probabilmente una buona risposta che posso assumere. Grazie! – ANisus
questo si interromperà all'infinito nella prima istruzione di selezione se il canale di uscita è chiuso. – jorelli
jorelli, abbastanza vero. Se si desidera consentire a goroutini ostili o infestati di chiudere il canale in modo imprevisto, si dovrebbe verificare lo stato ok sulla ricezione. – Sonia