Lorsqu'un canal est tamponné, cela signifie qu'il ne bloquera pas tant que le tampon est plein. Une fois le tampon plein, l'envoi de goroutine bloquera alors qu'il essaie d'ajouter des choses au canal.
Cela signifie que cela bloquera:
c := make(chan int)
c <- 1 // Block here, this is unbuffered !
println(<-c)
Et ce sera aussi bloquer:
c := make(chan int, 2)
c <- 1
c <- 2
c <- 3 // Block here, buffer is full !
println(<-c)
Mais le indiquer de Goroutines et Channel est précisément pour exécuter les choses simultanément, donc cela fonctionnera:
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
Et de même:
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
Dans votre exemple, vous engendrez quatre Goroutines différents, qui écrivent tous quatre nombres sur le même canal tamponné. Comme le tampon est 2 <16, ils finiront par bloquer
Mais le nœud du problème est que la politique GO est de attendez uniquement le goroutine principal:
L'exécution du programme commence par initialiser le package principal, puis invoquer la fonction principale de la fonction. Lorsque la fonction principale revient, le programme sort. Il n'attend pas que les autres Goroutines (non principaux) se terminent.
Cela signifie que dans votre premier exemple, le principale Goroutine bloquait lorsqu'il a atteint la ligne c <- 3
. Comme aucun autre goroutine n'a pu faire quoi que ce soit qui pourrait potentiellement le débloquer, le temps d'exécution a détecté que le programme était dans l'impasse et a signalé une erreur.
Dans votre deuxième exemple cependant, engendré Les Goroutines bloquent, tandis que le principal se poursuit tranquillement jusqu'à ce qu'il atteigne la fin de son exécution, à quel point tous les goroutins engendrés (bloqués) sont tués silencieusement, et aucune erreur n'est signalée.