[Ir] Explicación detallada de la instrucción select

Tabla de contenido

declaración de selección


selectoración

selectLas declaraciones se usan ampliamente en el lenguaje Go como una estructura de control para seleccionar entre múltiples operaciones de comunicación. Aquí hay selectalgunos usos comunes de las declaraciones:

  1. Selección multicanal: selectla 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és selectde declaraciones, se puede realizar la multiplexación en programas concurrentes para evitar bloqueos y esperas. Este es selectuno 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: selectlas declaraciones se pueden time.Afterusar junto con funciones para implementar el control de tiempo de espera sobre las operaciones. Al selectagregar 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: selectlas declaraciones pueden cooperar con defaultsucursales para implementar operaciones de comunicación sin bloqueo. Cuando no hay comunicación disponible, selectla declaración ejecuta inmediatamente defaultel código en la rama sin bloquear la espera.
select {
case data := <-channel:
    // 处理接收到的数据
default:
    // 没有任何通信可用时立即执行该分支
}
  • Control de salida del programa: selectlas 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结束")
}

Supongo que te gusta

Origin blog.csdn.net/fanjufei123456/article/details/131315632
Recomendado
Clasificación