Sobes.tech
Middle

Cos'è un canale in Go? Quali sono i tipi di canali? In cosa si differenziano i canali con buffer da quelli senza buffer?

sobes.tech AI

Risposta dell'AI

Un canale in Go è un tipo di dato utilizzato per trasmettere valori tra goroutine, garantendo sincronizzazione e scambio di dati.

Tipi di canali:

  • Canali senza buffer — non hanno buffer interno, l'invio si blocca finché il ricevitore non legge il valore.
  • Canali con buffer — hanno un buffer interno di dimensione fissa, e l'invio si blocca solo se il buffer è pieno.

Differenze:

  • Nei canali senza buffer, mittente e destinatario devono essere pronti contemporaneamente per inviare/recepire, garantendo una sincronizzazione rigorosa.
  • Nei canali con buffer, il mittente può mettere più valori nel buffer senza aspettare il ricevitore, finché il buffer non si riempie.

Esempio di creazione e utilizzo di un canale con buffer:

ch := make(chan int, 2) // buffer di 2 elementi
ch <- 1
ch <- 2
// ch <- 3 // si blocca finché non c'è spazio
fmt.Println(<-ch) // 1
fmt.Println(<-ch) // 2