En el lenguaje Go, la declaración de selección es como la declaración de cambio , pero en la declaración de selección, la declaración de caso se refiere a la comunicación, es decir, la operación de envío o recepción en el canal.
Sintaxis:
select{ case SendOrReceive1: // Statement case SendOrReceive2: // Statement case SendOrReceive3: // Statement ....... default: // Statement
Puntos importantes:
- La instrucción Select espera hasta que la comunicación (operación de envío o recepción) esté preparada para que comiencen algunos casos.
Ejemplo:
// Go program to illustrate the
// concept of select statement
package main
import(
"fmt"
"time"
)
// function 1
func portal1(channel1 chan string) {
time
.Sleep(3*
time
.Second)
channel1 <-
"Welcome to channel 1"
}
// function 2
func portal2(channel2 chan string) {
time
.Sleep(9*
time
.Second)
channel2 <-
"Welcome to channel 2"
}
// main function
func main(){
// Creating channels
R1:= make(chan string)
R2:= make(chan string)
// calling function 1 and
// function 2 in goroutine
go portal1(R1)
go portal2(R2)
select{
// case 1 for portal 1
case
op1:= <- R1:
fmt.Println(op1)
// case 2 for portal 2
case
op2:= <- R2:
fmt.Println(op2)
}
}
Producción:
Welcome to channel 1
Explicación: En el programa anterior, el portal 1 duerme durante 3 segundos y el portal 2 duerme durante 9 segundos después de que termine su tiempo de sueño, estarán listos para continuar. Ahora, la declaración de selección espera hasta su hora de dormir, cuando el portal 2 se despierta, selecciona el caso 2 e imprime «Bienvenido al canal 1». Si el portal 1 se despierta antes que el portal 2, la salida es «bienvenido al canal 2».
- Si una declaración de selección no contiene ninguna declaración de caso, entonces esa declaración de selección espera para siempre.
Sintaxis:
select{}
Ejemplo:
// Go program to illustrate the
// concept of select statement
package main
// main function
func main() {
// Select statement
// without any case
select{ }
}
Producción:
fatal error: all goroutines are asleep - deadlock! goroutine 1 [select (no cases)]: main.main() /home/runner/main.go:9 +0x20 exit status 2
- La declaración predeterminada en la declaración de selección se usa para proteger la declaración de selección del bloqueo. Esta declaración se ejecuta cuando no hay ninguna declaración de caso lista para continuar.
Ejemplo:
// Go program to illustrate the
// concept of select statement
package main
import
"fmt"
// main function
func main() {
// creating channel
mychannel:= make(chan
int
)
select{
case
<- mychannel:
default
:fmt.Println(
"Not found"
)
}
}
Producción:
Not found
- El bloqueo de la declaración de selección significa que cuando no hay una declaración de caso lista y la declaración de selección no contiene ninguna declaración predeterminada, entonces la declaración de selección se bloquea hasta que al menos una declaración de caso o comunicación pueda continuar.
Ejemplo:
// Go program to illustrate the
// concept of select statement
package main
// main function
func main() {
// creating channel
mychannel:= make(chan
int
)
// channel is not ready
// and no default case
select{
case
<- mychannel:
}
}
Producción:
fatal error: all goroutines are asleep - deadlock! goroutine 1 [chan receive]: main.main() /home/runner/main.go:14 +0x52 exit status 2
- En la declaración de selección, si varios casos están listos para continuar, entonces uno de ellos puede seleccionarse al azar.
Ejemplo:
// Go program to illustrate the
// concept of select statement
package main
import
"fmt"
// function 1
func portal1(channel1 chan string){
for
i := 0; i <= 3; i++{
channel1 <-
"Welcome to channel 1"
}
}
// function 2
func portal2(channel2 chan string){
channel2 <-
"Welcome to channel 2"
}
// main function
func main() {
// Creating channels
R1:= make(chan string)
R2:= make(chan string)
// calling function 1 and
// function 2 in goroutine
go portal1(R1)
go portal2(R2)
// the choice of selection
// of case is random
select{
case
op1:= <- R1:
fmt.Println(op1)
case
op2:= <- R2:
fmt.Println(op2)
}
}
Producción:
Welcome to channel 2
Publicación traducida automáticamente
Artículo escrito por ankita_saini y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA