Sto cercando di capire, come funziona il canale golang. Ho letto un libro sulla lingua go e ho trovato il seguente esempio.Perché succede qui un deadlock
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)
}
}
Quando ho eseguito questo programma, ho una situazione di stallo, ma quando cambio la funzione di generare per
// 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
}
Poi il programma verrà eseguito il ciclo infinito, ma non deadlock. Perché ottengo un deadlock quando rimuovo la condizione in loop?
Ho un deadlock, perché la goroutine nella funzione di generare è che il canale è chiuso dopo 100 cicli e primi ancora aspettano di ricevere i dati giusto? –
@zero_coding non è chiuso: non vedo 'close (primi)' ovunque – VonC
Intendo perché il ricevitore non si chiude, ma il mittente è chiuso a destra? Niente più mittente. –