Tôi đang cố gắng hiểu, cách thức hoạt động của kênh golang. Tôi đọc một cuốn sách về ngôn ngữ đi và tìm thấy ví dụ sau.Tại sao xảy ra ở đây một bế tắc
package main
import (
"fmt"
)
// Send the sequence 2, 3, 4, ... to returned channel
func generate() chan int {
ch := make(chan int)
go func() {
for i := 2; i <= 100 ; i++ {
ch <- i
}
}()
return ch
}
// Filter out input values divisible by 'prime', send rest to returned channel
func filter(in chan int, prime int) chan int {
out := make(chan int)
go func() {
for {
if i := <-in; i%prime != 0 {
out <- i
}
}
}()
return out
}
func sieve() chan int {
out := make(chan int)
go func() {
ch := generate()
for {
prime := <-ch
ch = filter(ch, prime)
out <- prime
}
}()
return out
}
func main() {
primes := sieve()
for {
fmt.Println(<-primes)
}
}
Khi tôi chạy programm này, tôi đã có một bế tắc, nhưng khi tôi thay đổi tạo ra chức năng để
// Send the sequence 2, 3, 4, ... to returned channel
func generate() chan int {
ch := make(chan int)
go func() {
for i := 2; ; i++ {
ch <- i
}
}()
return ch
}
Sau đó programm sẽ chạy vòng lặp vô hạn, nhưng không phải bế tắc. Tại sao tôi bị bế tắc, khi tôi loại bỏ tình trạng trong vòng lặp?
Tôi đã bế tắc, bởi vì goroutine trong chức năng tạo ra là các kênh được đóng sau 100 vòng và số nguyên tố vẫn chờ đợi để nhận dữ liệu phải không? –
@zero_coding không được đóng: Tôi không thấy 'close (số nguyên tố)' ở bất cứ đâu – VonC
Ý tôi là vì người nhận không đóng, nhưng người gửi gần đúng? Không có người gửi nữa. –