Middle
Go'da kapalı bir kanal ile ne yapılabilir?
sobes.tech yapay zeka
AI'dan gelen yanıt
Kapalı bir kanaldan okuma yaparken, kapatmadan önce yazılan tüm kalan verileri alabilirsiniz. Kanal boşaltıldıktan sonra, sonraki okuma işlemleri kanal öğe türünde sıfır değeri ve ikinci dönüş değeri olarak false dönecek, bu da kanalın kapatıldığını gösterir.
Kapatılmış bir kanala veri göndermek çalışma zamanında panik oluşturur.
Zaten kapatılmış bir kanalı kapatmaya çalışmak da çalışma zamanında panik oluşturur.
Bir kanalın kapatılıp kapatılmadığını ok operatörü kullanarak okuyarak kontrol edebilirsiniz:
package main
import (
"fmt"
)
func main() {
ch := make(chan int, 2)
ch <- 1
ch <- 2
close(ch)
// Kanal boşaltılana kadar kapalı kanaldan okuma
val1, ok1 := <-ch
fmt.Printf("Değer: %d, Ok: %t\n", val1, ok1) // Değer: 1, Ok: true
val2, ok2 := <-ch
fmt.Printf("Değer: %d, Ok: %t\n", val2, ok2) // Değer: 2, Ok: true
// Kanal boşaltıldıktan sonra okuma
val3, ok3 := <-ch
fmt.Printf("Değer: %d, Ok: %t\n", val3, ok3) // Değer: 0, Ok: false
// Kapalı kanala veri göndermeye çalışma (panik oluşturur)
// ch <- 3 // Bu satırı yorum satırı yapın, panik oluşur
// Zaten kapatılmış bir kanalı kapatmaya çalışma (panik oluşturur)
// close(ch) // Bu satırı yorum satırı yapın, panik oluşur
}
range kullanımı, kapatılmış bir kanal üzerinde, kanal boşalana kadar verileri sıralı şekilde okumaya izin verir ve döngü otomatik olarak sona erer.
package main
import (
"fmt"
)
func main() {
ch := make(chan int, 3)
ch <- 10
ch <- 20
close(ch)
// Kapatılmış kanal ile range kullanımı
for val := range ch {
fmt.Println(val) // 10 ve 20'yi yazdırır
}
}