Quando un canale è buffer, ciò significa che non bloccerà fino a quando il buffer non sarà pieno. Una volta che il buffer è pieno, la goroutine di invio si bloccherà mentre cerca di aggiungere cose al canale.
Ciò significa che questo bloccerà:
c := make(chan int)
c <- 1 // Block here, this is unbuffered !
println(<-c)
E questo lo farà anche bloccare:
c := make(chan int, 2)
c <- 1
c <- 2
c <- 3 // Block here, buffer is full !
println(<-c)
Ma il punto di goroutine e canale è proprio quello di eseguire le cose contemporaneamente, quindi funzionerà:
c := make(chan int)
go func() { c <- 1; }() // This will block in the spawned goroutine until...
println(<-c) // ... this line is reached in the main goroutine
E allo stesso modo:
c := make(chan int, 2)
go func() { // `go ...` spawns a goroutine
c <- 1 // Buffer is not full, no block
c <- 2 // Buffer is not full, no block
c <- 3 // Buffer is full, spawned goroutine is blocking until...
}()
println(<-c) // ... this line is reached in the main goroutine
Nel tuo esempio, generano quattro diverse goroutine, che scrivono tutte quattro numeri sullo stesso canale bufferico. Poiché il buffer è 2 <16, finiranno per bloccare
Ma il punto cruciale della questione è che la politica di Go Aspetta solo la goroutine principale:
L'esecuzione del programma inizia inizializzando il pacchetto principale e quindi invocando la funzione principale. Quando la funzione ritorna principale, il programma esce. Non aspetta il completamento di altre goroutine (non musicali).
Ciò significa che nel tuo primo esempio, il principale La goroutine stava bloccando quando ha raggiunto la linea c <- 3
. Poiché nessun'altra goroutine è stata in grado di fare qualsiasi cosa che potesse potenzialmente sbloccare, il runtime ha rilevato che il programma è stato bloccato e ha riportato un errore.
Nel tuo secondo esempio, tuttavia, generato Il blocco delle goroutine, mentre il principale continua in silenzio fino a quando non raggiunge la fine della sua esecuzione, a quel punto tutte le (bloccate) le goroutine generate vengono uccise silenziosamente e non viene segnalato alcun errore.