Junior — Middle
Σε ποιες συνθήκες πραγματοποιείται το μπλοκάρισμα κατά τη λειτουργία με το τυπικό κανάλι μετάδοσης δεδομένων;
sobes.tech AI
Απάντηση από AI
Στη Go, το τυπικό κανάλι μετάδοσης δεδομένων μπλοκάρει στις ακόλουθες περιπτώσεις:
- Όταν στέλνετε μια τιμή στο κανάλι (
chan <- value), εάν το κανάλι δεν έχει buffer ή ο buffer είναι γεμάτος, η goroutine αποστολής μπλοκάρει μέχρι να διαβάσει κάποιος άλλος το μήνυμα. - Όταν διαβάζετε από το κανάλι (
value := <- chan), εάν το κανάλι είναι άδειο, η goroutine ανάγνωσης μπλοκάρει μέχρι να υπάρχουν δεδομένα.
Έτσι, το μπλοκάρισμα συμβαίνει όταν προσπαθείτε να στείλετε δεδομένα σε γεμάτο κανάλι ή να διαβάσετε από άδειο κανάλι, διασφαλίζοντας συγχρονισμό μεταξύ των goroutines.
Παράδειγμα:
ch := make(chan int) // κανάλι χωρίς buffer
// Η αποστολή μπλοκάρει μέχρι κάποιος να διαβάσει
go func() {
ch <- 42
}()
τιμή := <-ch // η ανάγνωση ξεμπλοκάρει την αποστολή
fmt.Println(τιμή)