English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Tutoriel de base Golang

Instructions de contrôle Golang

Fonctions & méthodes Golang

Structures Golang

Coupes & tableaux Golang

Chains de caractères (String) Golang

Pointeurs Golang

Interfaces Golang

Concurrence Golang

Erreurs Golang

Autres articles Golang

Instruction Select du langage Go

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