Go Kanalları (Channels): Buffered vs Unbuffered & Select İfadesi
"Belleği paylaşarak iletişim kurma; iletişim kurarak belleği paylaş!"
Unbuffered: El sıkışmadır; sen elini uzattığında karşı taraf tutana kadar havada donup beklersin. Buffered: Posta kutusudur; kutu dolana kadar mektupları atıp gidersin, kutu dolunca postacı bekler.
Unbuffered Channel (make(chan T)) senkron bloklama yapar; gönderici ve alıcı aynı anda hazır olmalıdır. Buffered Channel (make(chan T, cap)) kapasitesi dolana kadar göndericiyi bloke etmez. select ifadesi birden çok kanal işlemini non-blocking multiplexing ile dinler.
“Unbuffered kanallar kesin senkronizasyon garantisi verirken, Buffered kanallar kuyruk işlevi görerek anlık yük patlamalarını dengeler. Kapanmış (closed) bir kanala veri göndermek panic fırlatır; ancak kapalı kanaldan veri okumak sıfır değer (zero value) ve false döner.”
ch := make(chan string, 1)
ch <- "mesaj" // Buffer var, bloke olmaz!
select {
case msg := <-ch:
fmt.Println("Alındı:", msg)
case <-time.After(500 * time.Millisecond):
fmt.Println("Zaman aşımı!")
}
Kapalı bir kanala (closed channel) veri yazmaya kalkışarak programı panikletmek (panic: send on closed channel).