Sobes.tech
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(τιμή)