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

Tutorial básico de Golang

Sentencias de control de Golang

Funciones & Métodos de Golang

Estructuras de Golang

Cortesía & Arreglos de Golang

Cadenas (String) de Golang

Punteros de Golang

Interfaz de Golang

Concurrencia de Golang

Excepciones de Golang

Misceláneas de Golang

Sentencia Select del lenguaje Go

En el lenguaje Go, la sentencia select es similar asentencia switchpero en la sentencia select, la cláusula case se refiere a la comunicación, es decir, la operación de envío o recepción en el canal.

Sintaxis:

select{
caso SendOrReceive1: // sentencia
caso SendOrReceive2: // sentencia
caso SendOrReceive3: // sentencia
......
por defecto: // sentencia

Cuestión importante:

  • La sentencia Select espera que la comunicación (operación de envío o recepción) esté lista para comenzar en ciertos casos.

    package main
    import (
        "fmt"
        "time"
    )
    // función 1
    func portal1(channel1 chan string) {
        time.Sleep(3 * time.Second)
        channel1 <- "Bienvenido a canal 1"
    }
    // función 2
    func portal2(channel2 chan string) {
        time.Sleep(9 * time.Second)
        channel2 <- "Bienvenido a canal 2"
    }
    func main() {
        // Crear un canal
        R1 := make(chan string)
        R2 := make(chan string)
        // Llamar a la función utilizando goroutine1y la función2
        go portal1(R1)
        go portal2(R2)
        select {
        // caso 1
        case op1 := <-R1:
            fmt.Println(op1)
        // caso 2
        case op2 := <-R2:
            fmt.Println(op2)
        }
    }

    Salida:

    Bienvenido a canal 1

    Explicación de uso:en el programa anterior, portal1duerme3segundo, portal2duerme9segundos, al final de su tiempo de sueño, estarán listos para continuar. Ahora, la declaración select espera su tiempo de sueño, cuando portal2se despierta, elige el caso 2y muestra "Bienvenido a canal 1". Si el portal1en portal2previamente despierto, entonces se mostrará "Bienvenido a canal 2。

  • Si una declaración select no contiene ninguna declaración case, esta declaración select se espera permanentemente.

    Sintaxis:

    select{}
    package main 
      
    func main() { 
          
       //No hay casos, se espera permanentemente
       select{ } 
    }

    Salida:

    error fatal: todas las goroutines están durmiendo - ¡bloqueo!
    goroutine 1 [select (sin casos)]:
    main.main()
        /home/runner/main.go:9 +0x20
    estado de salida 2
  • La declaración por defecto en una declaración select se utiliza para proteger que la declaración select no se bloquee. Cuando no hay declaraciones case listas para ejecutarse, se ejecutará esta declaración.

    package main
    import "fmt"
    func main() {
        //Crear un canal
        mychannel := make(chan int)
        select {
        case <-mychannel:
        por defecto:
            fmt.Println("No encontrado")
        }
    }

    Salida:

    No encontrado
  • La bloqueación de una declaración select significa que cuando no hay una declaración case lista y la declaración select no contiene ninguna declaración por defecto, la declaración select se bloqueará hasta que al menos una declaración case o comunicación pueda continuar.

    package main
    func main() {
        //Crear un canal
        mychannel := make(chan int)
        //el canal no está listo
        //y no hay una declaración por defecto
        select {
        case <-mychannel:
        }
    }

    Salida:

    error fatal: todas las goroutines están durmiendo - ¡bloqueo!
    goroutine 1 [chan receive]:
    main.main()
        /home/runner/main.go:14 +0x52
    estado de salida 2
  • En una declaración select, si está listo para manejar múltiples situaciones, se puede elegir aleatoriamente una de ellas.

    package main 
      
    import "fmt"
          
          
        //función 1 
        func portal1(channel1 chan string){ 
            for i := 0; i <= 3; i++{ 
                channel1 <- "Bienvenido a canal 1"
            } 
              
        } 
          
        //función 2 
         func portal2(channel2 chan string){ 
            channel2 <- "Bienvenido a canal 2"
        } 
      
    func main() { 
          
        //Crear un canal 
       R1:= make(chan string) 
       R2:= make(chan string) 
         
       //Llame a la función utilizando el método goroutine1y2
       go portal1(R1) 
       go portal2(R2) 
       
       //Elija aleatoriamente uno
       select{ 
           case op1:= <- R1: 
           fmt.Println(op1) 
           case op2:= <- R2: 
           fmt.Println(op2) 
       } 
    }

    Salida:

    Bienvenido a canal 2