Junior — Middle
Come viene realizzata l'interazione attraverso un canale bufferizzato e come avviene il trasferimento dei dati?
sobes.tech AI
Risposta dell'AI
In Go, un canale con buffer viene creato specificando la sua dimensione, ad esempio: ch := make(chan int, 3). Questo canale può contenere fino a 3 elementi senza bloccare il mittente.
Quando si trasmettono dati attraverso un canale con buffer:
- Il mittente (
chan <- value) inserisce il valore nel buffer del canale. Se il buffer non è pieno, l'operazione non blocca. - Se il buffer è pieno, il mittente si blocca fino a che non si libera spazio.
- Il ricevente (
value := <- chan) estrae il valore dal buffer. Se il buffer è vuoto, il ricevente si blocca fino a che non ci sono dati.
Esempio:
ch := make(chan int, 2)
ch <- 1 // non si blocca, c'è 1 elemento nel buffer
ch <- 2 // non si blocca, ci sono 2 elementi nel buffer (buffer pieno)
fmt.Println(<-ch) // stampa 1, libera spazio nel buffer
ch <- 3 // ora si può inviare, c'è spazio
In questo modo, i canali con buffer permettono di memorizzare temporaneamente i dati e riducono le blocchi tra le goroutine.