English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Dans le langage Go, la phrase select est similaire àphrase switchMais dans une phrase select, la phrase cas fait référence à la communication, c'est-à-dire aux opérations d'envoi ou de réception sur le canal.
Syntaxe :
select{ cas SendOrReceive1: // phrase cas SendOrReceive2: // phrase cas SendOrReceive3: // phrase ...... par défaut: // phrase
Matière à savoir :
La phrase Select attend la préparation de la communication (opérations d'envoi ou de réception) pour commencer dans certains cas.
package main import ( "fmt" "time" ) // fonction 1 func portal1(channel1 chan string) { time.Sleep(3 * time.Second) channel1 <- "Bienvenue sur le canal 1" } // fonction 2 func portal2(channel2 chan string) { time.Sleep(9 * time.Second) channel2 <- "Bienvenue sur le canal 2" } func main() { // Créer un canal R1 := make(chan string) R2 := make(chan string) // Appel de la fonction avec goroutine1et la fonction2 go portal1(R1) go portal2(R2) select { // cas 1 case op1 := <-R1: fmt.Println(op1) // cas 2 case op2 := <-R2: fmt.Println(op2) } }
Sortie :
Bienvenue sur le canal 1
Explication d'utilisation :dans le programme ci-dessus, portal1s'endort3seconde, portal2s'endort9secondes, à la fin de leur temps de sommeil, elles seront prêtes à continuer. Maintenant, l'instruction select attend leur temps de sommeil, lorsque portal2se réveille, il choisit le case 2et affiche "Bienvenue sur le canal 1". Si le portail1dans portal2Si elle est réveillée avant, alors elle affichera "Bienvenue sur le canal 2”。
Si l'instruction select ne contient aucune instruction case, cette instruction select attendra éternellement.
Syntaxe :
select{}
package main func main() { //Il n'y a pas de case, il continuera à attendre select{ } }
Sortie :
erreur fatale : toutes les goroutines sont endormies - deadlock! goroutine 1 [select (no cases)]: main.main() /home/runner/main.go:9 +0x20 Statut de sortie 2
L'instruction par défaut dans l'instruction select est utilisée pour protéger l'instruction select contre le blocage. Lorsqu'aucune instruction case n'est prête, cette instruction est exécutée.
package main import "fmt" func main() { //Créer un canal mychannel := make(chan int) select { case <-mychannel: par défaut: fmt.Println("Non trouvé") } }
Sortie :
Non trouvé
Le blocage de l'instruction select signifie que lorsque none des instructions case est prête et que l'instruction select ne contient aucune instruction par défaut, l'instruction select sera bloquée jusqu'à ce qu'au moins une instruction case ou une communication puisse continuer.
package main func main() { //Créer un canal mychannel := make(chan int) //Le canal n'est pas prêt //et il n'y a pas de instruction par défaut select { case <-mychannel: } }
Sortie :
erreur fatale : toutes les goroutines sont endormies - deadlock! goroutine 1 [chan receive]: main.main() /home/runner/main.go:14 +0x52 Statut de sortie 2
Dans une instruction select, si vous devez gérer plusieurs cas, vous pouvez choisir au hasard l'un d'entre eux.
package main import "fmt" //fonction 1 func portal1(channel1 chan string){ for i := 0; i <= 3; i++{ channel1 <- "Bienvenue sur le canal 1" } } //fonction 2 func portal2(channel2 chan string){ channel2 <- "Bienvenue sur le canal 2" } func main() { //Créer un canal R1:= make(chan string) R2:= make(chan string) //appeler une fonction en utilisant la méthode goroutine1et2 go portal1(R1) go portal2(R2) //choisir au hasard une select{ case op1:= <- R1: fmt.Println(op1) case op2:= <- R2: fmt.Println(op2) } }
Sortie :
Bienvenue sur le canal 2