2つのチャンネルをリッスンして、両方のチャンネルが空になったときにブロックすることを希望します。しかし、両方のチャンネルにデータが含まれている場合は、もう一方のチャンネルが処理される前に排水されることを望みます。Go select文の優先順位回避策回避策
以下の作業例では、を処理する前にすべてout
を流しておきたいと思います。私は優先順位を持たないselect
-statementを使用します。問題を回避するにはどうしたらよいでしょうか?出口の前に10個のアウト・バリューをすべて処理しますか?
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")
}
アイデアは私のものと非常に似ています。しかし、 'continue'ステートメントを使うと、フラグの必要がなくなります。スマート。さて、これはおそらく私が得ることができるように良い答えです。ありがとう! – ANisus
アウトチャネルが閉じている場合、これは最初のselect文で無限ループします。 – jorelli
jorelli、かなり真実。敵対的またはバグのあるゴルーチンが予期せずチャンネルを閉じることを許可したい場合は、受信時にokステータスをチェックします。 – Sonia