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