« Programmation en Go/Goroutines » : différence entre les versions

Contenu supprimé Contenu ajouté
m <source lang="go">
Ligne 8 :
Le mot clé '''go''' permet de lancer un appel de fonction en une goroutine, et de ne pas attendre le résultat:
 
<source lang="go"> go list.Sort() // trie une liste en parallèle</source>
 
Il est courant d'utiliser une fonction littérale pour appeler une goroutine:
 
<source lang="go">
go func(arguments, ...) {
commandes...
} (paramètres, ...)
</source>
 
== Les canaux (de communication) ==
Ligne 21 ⟶ 23 :
On peut créer un canal avec make:
 
<source lang="go">
c := make(chan int)
</source>
 
Ensuite on peut envoyer et recevoir des données du type précisé, et la première donnée reçue est la première donnée envoyée. (''First In First Out'')
Ligne 29 ⟶ 33 :
Dans cet exemple, on lance une goroutine et on attend sa fin en recevant le signal qu'elle va envoyer:
 
<source lang="go">
go func() {
list.Sort()
Ligne 35 ⟶ 40 :
blahBlahPendantUnMoment()
<-c // Attend la fin du tri de la liste à la réception du signal
</source>
 
== Canaux avec tampon ==
Ligne 44 ⟶ 50 :
Dans l'exemple suivant, MaxTaches tâches peuvent se dérouler en parallèle:
 
<source lang="go">
var sem = make(chan int, MaxTaches)
 
Ligne 58 ⟶ 65 :
}
}
</source>
 
La syntaxe suivante permet de savoir si une case est disponible dans le canal:
 
<source lang="go"> v,ok = <- canal</source>
 
== Select ==
 
Select est une structure de contrôle similaire à switch. Elle permet de gérer une multitude d'envois et de réceptions à travers des canaux différents.
 
Voici sa syntaxe:
 
<source lang="go">
select {
case canal <- valeur: commandes...
Ligne 74 ⟶ 84 :
default: ...
}
</source>
 
Les différentes alternatives sont évaluées dans l'ordre de leur écriture, la première réception ou émission dans un canal déclenche l'exécution des commandes correspondant à l'alternative. Si aucune de ces opérations ne réussit, le cas par défaut est exécuté, sinon l'opération bloque jusqu'à la réception ou l'envoi d'une donnée.
 
Le choix entre les différentes alternatives est basé sur un processus pseudo-aléatoire.
 
Enfin, une structure '''select''' sans aucune alternative bloque éternellement.