Tabla de contenido
select
oración
select
Las declaraciones se usan ampliamente en el lenguaje Go como una estructura de control para seleccionar entre múltiples operaciones de comunicación. Aquí hay select
algunos usos comunes de las declaraciones:
- Selección multicanal:
select
la declaración puede monitorear las operaciones de lectura y escritura de múltiples canales al mismo tiempo y seleccionar una de las operaciones ejecutables para su procesamiento. A travésselect
de declaraciones, se puede realizar la multiplexación en programas concurrentes para evitar bloqueos y esperas. Este esselect
uno de los usos más comunes de las sentencias.
select {
case <-channel1:
// 处理channel1接收操作
case data := <-channel2:
// 处理channel2接收操作
case channel3 <- value:
// 处理channel3发送操作
default:
// 当没有任何通信可用时执行该分支
}
- Procesamiento de tiempo de espera:
select
las declaraciones se puedentime.After
usar junto con funciones para implementar el control de tiempo de espera sobre las operaciones. Alselect
agregar un canal de temporizador en la declaración, puede esperar la finalización de la operación dentro del tiempo especificado y realizar el procesamiento de tiempo de espera si se excede el tiempo establecido.
timeout := time.After(5 * time.Second)
select {
case result := <-dataChannel:
// 处理接收到的数据
case <-timeout:
// 执行超时处理
}
- Opciones de bloqueo y no bloqueo:
select
las declaraciones pueden cooperar condefault
sucursales para implementar operaciones de comunicación sin bloqueo. Cuando no hay comunicación disponible,select
la declaración ejecuta inmediatamentedefault
el código en la rama sin bloquear la espera.
select {
case data := <-channel:
// 处理接收到的数据
default:
// 没有任何通信可用时立即执行该分支
}
- Control de salida del programa:
select
las declaraciones se pueden usar junto con canales de salida especiales para controlar la salida del programa. Al escuchar el canal de salida, la operación de salida puede activarse cuando el programa debe finalizar.
done := make(chan bool)
select {
case <-interruptChannel:
// 处理中断事件
done <- true
case <-terminateChannel:
// 处理终止事件
done <- true
case <-done:
// 接收到退出信号,结束程序
}
- select puede monitorear uno o más canales al mismo tiempo hasta que uno de los canales esté listo
package main
import (
"fmt"
"time"
)
func test1(ch chan string) {
time.Sleep(time.Second * 5)
ch <- "test1"
}
func test2(ch chan string) {
time.Sleep(time.Second * 2)
ch <- "test2"
}
func main() {
// 2个管道
output1 := make(chan string)
output2 := make(chan string)
// 跑2个子协程,写数据
go test1(output1)
go test2(output2)
// 用select监控
select {
case s1 := <-output1:
fmt.Println("s1=", s1)
case s2 := <-output2:
fmt.Println("s2=", s2)
}
}
- Si varios canales están listos al mismo tiempo, seleccione uno al azar para ejecutar
package main
import (
"fmt"
)
func main() {
// 创建2个管道
int_chan := make(chan int, 1)
string_chan := make(chan string, 1)
go func() {
//time.Sleep(2 * time.Second)
int_chan <- 1
}()
go func() {
string_chan <- "hello"
}()
select {
case value := <-int_chan:
fmt.Println("int:", value)
case value := <-string_chan:
fmt.Println("string:", value)
}
fmt.Println("main结束")
}