0Pricing
Go Academy · Lección

La sentencia select

Multiplexación de channels con select

La sentencia select es una lección gratuita de Go Academy en CoddyKit. Esta es la lección 1 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Go Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Go Academy incluye 4 lecciones en total.

¿Qué es select?

La instrucción select permite que una goroutine espere simultáneamente varias operaciones de canal. Elige el primer caso que esté listo para continuar, de forma similar a un switch, pero para canales.

Sintaxis básica

Cada case de un select es un envío o una recepción en un canal:

select {
case msg := <-ch1:
    fmt.Println("ch1:", msg)
case msg := <-ch2:
    fmt.Println("ch2:", msg)
}

Sin bloqueo con default

Al añadir un caso default, el select deja de bloquearse: si ningún canal está listo, pasa inmediatamente a default.

select {
case v := <-ch:
    fmt.Println(v)
default:
    fmt.Println("no value ready")
}

Selección aleatoria

Cuando varios casos están listos al mismo tiempo, Go elige uno al azar: todos los casos listos tienen la misma probabilidad de ser seleccionados. Esto evita la inanición.

Envío en select

Los casos también pueden ser envíos a canales. Un caso de envío está listo cuando el canal tiene espacio en el búfer (o hay un receptor esperando).

select {
case ch1 <- val1:
    fmt.Println("sent to ch1")
case ch2 <- val2:
    fmt.Println("sent to ch2")
}

Un select vacío bloquea para siempre

Un select{} sin casos bloquea la goroutine actual para siempre. Es un recurso habitual para mantener activa la goroutine principal mientras se ejecutan otras goroutines.

func main() {
    go serve()
    select {} // block forever
}

Bucles con select

Incluya un select dentro de un bucle for para multiplexar canales continuamente. Añada un canal done para salir de forma ordenada.

for {
    select {
    case v := <-data:
        process(v)
    case <-done:
        return
    }
}

Canales nil

Un canal nil bloquea para siempre en un caso de select, lo que desactiva dicho caso en la práctica. Puede utilizar esta característica para activar o desactivar casos dinámicamente durante la ejecución.

var ch chan int // nil
select {
case v := <-ch: // never selected
    _ = v
case v := <-other:
    fmt.Println(v)
}

Select con canales cerrados

Una recepción desde un canal cerrado siempre tiene éxito de inmediato y devuelve el valor cero. Utilice la forma de dos valores para detectar el cierre.

select {
case v, ok := <-ch:
    if !ok { return } // channel closed
    use(v)
}

Patrones de prioridad

Go select no admite prioridades de forma nativa. Para dar prioridad a un canal, anide selects o utilice un bucle que compruebe primero el canal de alta prioridad con un default.

for {
    select {
    case v := <-highPriority:
        handle(v)
    default:
        select {
        case v := <-lowPriority:
            handle(v)
        }
    }
}

Repaso hasta ahora

select espera varios canales, elige un caso listo al azar, admite default para no bloquearse y los canales nil desactivan casos. Patrón habitual: for+select+done.

Comprobación rápida

¿Qué ocurre cuando varios casos de un select están listos al mismo tiempo?

Repaso: la instrucción select

Puntos clave:

  • select se bloquea hasta que un caso de canal está listo
  • Varios casos listos → selección aleatoria
  • default evita el bloqueo
  • Un canal nil desactiva su caso
  • for+select+done es el bucle de multiplexación estándar

Preguntas frecuentes

¿La lección «La sentencia select» es gratis?

Sí — el texto completo de «La sentencia select» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Go Academy, actualiza a CoddyKit PRO. El curso de Go Academy incluye 4 lecciones en total.

¿Qué aprenderé en «La sentencia select»?

Multiplexación de channels con select Practicas Go Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Go Academy?

No se requiere experiencia previa. Go Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 1 de 4.

¿Cuánto tiempo toma la lección «La sentencia select»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Go Academy?

Sí. Cada lección de Go Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. La sentencia select
  2. Tiempos de espera y tickers
  3. Patrones fan-in y fan-out
  4. Patrón de pool de workers
← Volver a Go Academy