0Pricing
Go Academy · Lezione

L'istruzione select

Multiplexing dei canali con select

L'istruzione select è una lezione Go Academy gratuita su CoddyKit. Questa è la lezione 1 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Go Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Go Academy include 4 lezioni in totale.

Che cos'è select

L'istruzione select consente a una goroutine di attendere contemporaneamente più operazioni sui canali. Sceglie il primo caso pronto a procedere, in modo simile a un switch, ma per i canali.

Sintassi di base

Ogni case in un select corrisponde a un invio o a una ricezione su un canale:

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

Non bloccante con default

L'aggiunta di un caso default rende select non bloccante: se nessun canale è pronto, l'esecuzione passa immediatamente a default.

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

Selezione casuale

Quando più casi sono pronti contemporaneamente, Go ne sceglie uno a caso: ogni caso pronto ha la stessa probabilità di essere selezionato. Questo evita la starvation.

Invio in select

I casi possono anche corrispondere a invii su un canale. Un caso di invio è pronto quando il canale ha spazio nel buffer (oppure quando è in attesa un ricevitore).

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

Un select vuoto si blocca per sempre

Un select{} senza casi blocca per sempre la goroutine corrente. È un idioma comune per mantenere attiva la goroutine principale mentre vengono eseguite altre goroutine.

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

Ciclo con select

Inserisca un select in un ciclo for per multiplexare continuamente i canali. Aggiunga un canale done per uscire in modo ordinato.

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

Canali nil

Un canale nil si blocca per sempre in un caso di select, disabilitando di fatto quel caso. Può usarlo per abilitare o disabilitare dinamicamente i casi durante l'esecuzione.

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

Select con canali chiusi

Una ricezione da un canale chiuso ha sempre esito immediato e restituisce il valore zero. Usi la forma a due valori per rilevare la chiusura.

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

Pattern di priorità

Il select di Go non supporta nativamente le priorità. Per dare la priorità a un canale, annidi i select oppure usi un ciclo che controlli prima il canale ad alta priorità con un default.

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

Riepilogo finora

select attende più canali, sceglie casualmente un caso pronto, supporta default per operazioni non bloccanti e i canali nil disabilitano i casi. Pattern comune: for+select+done.

Verifica rapida

Che cosa succede quando più casi in un select sono pronti contemporaneamente?

Riepilogo: l'istruzione select

Punti chiave:

  • select si blocca finché un caso relativo a un canale non è pronto
  • Più casi pronti → selezione casuale
  • default lo rende non bloccante
  • un canale nil disabilita il relativo caso
  • for+select+done è il ciclo standard per il multiplexing

Domande Frequenti

La lezione «L'istruzione select» è gratuita?

Sì — il testo completo di «L'istruzione select» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Go Academy, passa a CoddyKit PRO. Il corso Go Academy include 4 lezioni in totale.

Cosa imparerò in «L'istruzione select»?

Multiplexing dei canali con select Eserciti Go Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Go Academy?

Non è richiesta alcuna esperienza precedente. Go Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 1 di 4.

Quanto tempo richiede la lezione «L'istruzione select»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Go Academy?

Sì. Ogni lezione Go Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. L'istruzione select
  2. Timeout e ticker
  3. Modelli fan-in e fan-out
  4. Modello del worker pool
← Torna a Go Academy