Sobes.tech
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
	}
}