Middle
Go'da kapalı bir kanaldan okuma sırasında ne gibi sonuçlar ortaya çıkabilir?
sobes.tech yapay zeka
AI'dan gelen yanıt
Kapalı bir kanaldan okuma, kanalın öğe türünün null değerini hemen alır ve engelleme yapmaz. Eğer ikinci bir boolean dönen parametre varsa, bu false olur.
package main
import (
"fmt"
)
func main() {
ch := make(chan int, 1) // Bufferli kanal
ch <- 1
close(ch)
val, ok := <-ch // Kapalı kanaldan okuma
fmt.Printf("Değer: %d, Açık: %t\n", val, ok) // "Değer: 1, Açık: true" yazdırılır
val, ok = <-ch // Aynı kapalı kanaldan tekrar okuma
fmt.Printf("Değer: %d, Açık: %t\n", val, ok) // "Değer: 0, Açık: false" yazdırılır
// Kapalı kanaldan diğer okumalar
val, ok = <-ch
fmt.Printf("Değer: %d, Açık: %t\n", val, ok) // "Değer: 0, Açık: false" yazdırılır
}
Ana sonuçlar:
- Null değer alınması: Program çökmeyecek, ancak kanala ait varsayılan null değeri alınacaktır.
- Kapanış göstergesi: Eğer kullanılırsa, ikinci boolean parametre
falseolur, bu da kanalın kapandığını ve alınan değerin null olduğunu gösterir. - Engellemesiz okuma: Okuma işlemi goroutine’yi engellemez.
- Panik yok: Kapalı bir kanala yazmak dışında, kapalı bir kanaldan okumak paniğe neden olmaz.
Açık ve kapalı kanaldan okuma karşılaştırması:
| Kanal durumu | İşlem | Davranış | Dönen değer (ikinci parametre varsa) |
|---|---|---|---|
| Açık | <-ch |
Bloklama, değer veya kapanış alınana kadar | Değer, true |
| Açık | val, ok := <-ch |
Bloklama, değer veya kapanış alınana kadar | Değer, true |
| Kapalı | <-ch |
Hemen alınır | Null değer |
| Kapalı | val, ok := <-ch |
Hemen alınır | Null değer, false |
İkinci boolean parametresi kullanımı, kanaldan gerçek bir öğe alınıp alınmadığını veya kanalın kapatılıp kapatılmadığını belirlemenin önerilen yoludur.
package main
import (
"fmt"
)
func main() {
ch := make(chan int, 1)
ch <- 1
close(ch)
for {
val, ok := <-ch
if !ok {
fmt.Println("Kanal kapandı, döngüden çıkılıyor.")
break
}
fmt.Printf("Alınan değer: %d\n", val)
}
}
Bu davranış, kanal kapandıktan sonra okuyan goroutine’lerin şık bir şekilde sonlandırılmasını sağlar.