English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Dans le langage Go, la phrase select est commeInstructions switchMais dans la phrase select, les cas de la phrase font référence à la communication, c'est-à-dire aux opérations d'envoi ou de réception sur le canal.
Syntaxe :
select{ case SendOrReceive1: // Déclaration case SendOrReceive2: // Déclaration case SendOrReceive3: // Déclaration ....... default : // Déclaration }
Dans cet article, nous allons apprendre à utiliser le cas par défaut pour éviter le deadlock. Mais d'abord, nous devons comprendre ce qu'est un deadlock ?
Deadlock :Lorsque vous essayez de lire ou d'écrire des données dans un canal mais que le canal n'a pas de valeur. Par conséquent, il bloque l'exécution actuelle de la goroutine et transmet le contrôle à d'autres goroutines, mais si il n'y a pas d'autres goroutines disponibles ou si d'autres goroutines sont endormies en raison de cette situation, le programme va s'effondrer. Ce phénomène est appelé deadlock. Comme dans l'exemple suivant :
package main func main() { //Créer un canal //Le deadlock se produit parce qu'il n'y a pas de goroutine qui écrit //Par conséquent, la phrase select est bloquée à jamais c := make(chan int) select { case <-c : } }
Sortie :
erreur fatale : toutes les goroutines sont endormies - deadlock ! goroutine 1 [canal réception] : main.main()
Pour éviter cela, nous utilisons le cas par défaut dans la phrase select. Autrement dit, lorsque le programme entre en deadlock, le cas par défaut de la phrase select est exécuté pour éviter le deadlock. Comme dans l'exemple suivant, nous utilisons le cas par défaut dans la phrase select pour éviter le deadlock.
package main import "fmt" func main() { //Créer un canal c := make(chan int) select { case <-c : default : fmt.Println("!.. Cas par défaut..!") } }
Sortie :
!.. Cas par défaut..!
Lorsque la phrase select n'a que des canaux nil, il est également permis d'utiliser le cas par défaut. Comme dans l'exemple suivant, le canal c est nil, donc il s'exécute dans le cas par défaut. Si le cas par défaut ici n'est pas disponible, le programme sera bloqué à jamais, entraînant un verrouillage des ressources.
package main import "fmt" func main() { //Créer un canal var c chan int select { case x1 := <-c : fmt.Println("Valeur : ", x1) default : fmt.Println("Cas par défaut...!") } }
Sortie :
Default case...!