Tôi muốn nghe thường xuyên trên hai kênh, bị chặn khi cả hai kênh đều bị cạn kiệt. Tuy nhiên, nếu cả hai kênh đều chứa dữ liệu, tôi muốn một kênh bị cạn kiệt trước khi kênh kia được xử lý.Mức độ ưu tiên trong cách giải quyết lựa chọn Go
Trong ví dụ hoạt động bên dưới, tôi muốn tất cả out
được tháo ra trước khi exit
được xử lý. Tôi sử dụng một mã số select
không có bất kỳ thứ tự ưu tiên nào. Làm thế nào tôi có thể nhận được xung quanh vấn đề, làm cho tất cả 10 out-giá trị được xử lý trước khi xuất cảnh?
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")
}
Ý tưởng rất giống với ý tưởng của tôi. Nhưng đúng, với câu lệnh 'continue', bạn sẽ loại bỏ sự cần thiết của một lá cờ. Thông minh. Vâng, điều này có lẽ là một câu trả lời tốt như tôi có thể giả định để có được. Cảm ơn! – ANisus
điều này sẽ lặp vô hạn trong câu lệnh chọn đầu tiên nếu kênh ngoài bị đóng. – jorelli
jorelli, khá đúng. Nếu bạn muốn cho phép goroutines thù địch hoặc bị lỗi đóng kênh bất ngờ, bạn sẽ kiểm tra trạng thái ok khi nhận. – Sonia