Middle
Go-da bağlanmış kanaldan oxuma zamanı hansı nəticələr ortaya çıxa bilər?
sobes.tech Süni İntellekt
AI-dan cavab
Bağlanmış kanaldan oxumaq, kanalın element növünün null dəyərini dərhal alır və bloklamır. Əgər ikinci boolean parametr qaytarılırsa, o false olacaq.
package main
import (
"fmt"
)
func main() {
ch := make(chan int, 1) // Bufferli kanal
ch <- 1
close(ch)
val, ok := <-ch // Bağlanmış kanaldan oxumaq
fmt.Printf("Dəyər: %d, Açıq: %t\n", val, ok) // "Dəyər: 1, Açıq: true" göstərəcək
val, ok = <-ch // Eyni bağlanmış kanaldan təkrar oxumaq
fmt.Printf("Dəyər: %d, Açıq: %t\n", val, ok) // "Dəyər: 0, Açıq: false" göstərəcək
// Bağlanmış kanaldan əlavə oxumalar
val, ok = <-ch
fmt.Printf("Dəyər: %d, Açıq: %t\n", val, ok) // "Dəyər: 0, Açıq: false" göstərəcək
}
Əsas nəticələr:
- Null dəyər əldə etmək: Proqram çökməyəcək, lakin kanala aid standart null dəyər alınacaq.
- Bağlanma göstəricisi: İkinci boolean parametr, istifadə olunarsa,
falseolur, bu da kanalın bağlandığını və alınan dəyərin null olduğunu göstərir. - Bloklamadan oxuma: Oxuma əməliyyatı goroutine-i bloklamayacaq.
- Panika olmadan: Bağlanmış kanala yazmaqdan fərqli olaraq, bağlanmış kanaldan oxuma panik yaratmır.
Açıq və bağlanmış kanaldan oxuma müqayisəsi:
| Kanal vəziyyəti | Əməliyyat | Davranış | Qaytarılan dəyər (əgər ikinci parametr mövcuddursa) |
|---|---|---|---|
| Açıq | <-ch |
Bloklama, dəyər və ya bağlanma alınana qədər | Dəyər, true |
| Açıq | val, ok := <-ch |
Bloklama, dəyər və ya bağlanma alınana qədər | Dəyər, true |
| Bağlanmış | <-ch |
Dərhal alınır | Null dəyər |
| Bağlanmış | val, ok := <-ch |
Dərhal alınır | Null dəyər, false |
İkinci boolean parametrinin istifadəsi, kanaldan real elementin alınıb-alınmadığını və ya kanalın bağlandığını müəyyən etmək üçün tövsiyə olunan yoldur.
package main
import (
"fmt"
)
func main() {
ch := make(chan int, 1)
ch <- 1
close(ch)
for {
val, ok := <-ch
if !ok {
fmt.Println("Kanal bağlandı, döngüdən çıxılır.")
break
}
fmt.Printf("Alınan dəyər: %d\n", val)
}
}
Bu davranış, kanal bağlandıqdan sonra onu oxuyan goroutine-lərin şık şəkildə sona çatmasını təmin edir.