Go Channels: Goroutine'ler Arası İletişim Rehberi
# Go Channels: Goroutine'ler Arası İletişim Rehberi
Go'da birden fazla goroutine (hafif thread) çalıştırırken en büyük sorun bunların birbiriyle konuşmasıdır. Channel'lar tam burada devreye girer, goroutine'ler arasında güvenli ve senkronize veri akışını sağlayan iletişim kanalı.
Channel, bir goroutine'den diğerine veri gönderip almak için kullanılan bir boru gibidir. Bir ucundan veri gönderirsin, diğer ucundan alırsın. Temel avantajı: veri gönderirken alıcı hazır olana kadar bekleme (senkronizasyon) otomatik olur.
Channel'ı `make()` ile tanımlarsın. Veri tipi belirtmek zorunludur:
1ch:= make(chan int) // int tipinde veri taşıyan channelGönderme için `<-` operatörü kullanılır:
1ch <- 42 // channel'a veri gönder2value:= <-ch // channel'dan veri alİki goroutine'nin birbirine mesaj göndermesini sağlayan tam bir program:
1package main23import (4"fmt"5"time"6)78func main() {9// int tipinde channel oluştur10ch:= make(chan int)1112// İlk goroutine: sayı gönder13go func() {14fmt.Println("Goroutine 1: Sayı gönderiyorum...")15time.Sleep(1 * time.Second)16ch <- 10017}()1819// İkinci goroutine: sayı al ve işle20go func() {21num:= <-ch22fmt.Printf("Goroutine 2: %d aldım!\n", num)23}()2425// Programın bitmemesi için bekle26time.Sleep(3 * time.Second)27}Beklenen çıktı:
1Goroutine 1: Sayı gönderiyorum...2Goroutine 2: 100 aldım!Burada `ch <- 100` satırında gönderici goroutine bekler; alıcı goroutine `<-ch` ile alana kadar bloklanır. Bu otomatik senkronizasyon channel'ların gücüdür.
Eğer gönderici beklemeden hızlı veri göndermek istersen, buffer kapasitesi tanımla:
1ch:= make(chan int, 2) // 2 veri depolayabilen channel2ch <- 13ch <- 24// Henüz kimse almadı ama sorun yok; buffer dolana kadar devam edebilirVeri gönderimi bittiğinde channel'ı kapat:
1close(ch)Kapalı channel'dan okumak mümkün (kalan veriler alınır), ama yazma hata verir.
Channel'lar Go'da goroutine koordinasyonunun temelini oluşturur. Basit kuralı hatırla: gönder (`<-`), al (`<-`), bekle, senkronize et. Kompleks programlarda bu basit mekanizmayla çok güçlü eşzamanlı sistemler inşa edebilirsin.
0 yorum