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 channel

Gönderme için `<-` operatörü kullanılır:

1ch <- 42 // channel'a veri gönder
2value:= <-ch // channel'dan veri al

İki goroutine'nin birbirine mesaj göndermesini sağlayan tam bir program:

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası
1package main
2
3import (
4"fmt"
5"time"
6)
7
8func main() {
9// int tipinde channel oluştur
10ch:= make(chan int)
11
12// İlk goroutine: sayı gönder
13go func() {
14fmt.Println("Goroutine 1: Sayı gönderiyorum...")
15time.Sleep(1 * time.Second)
16ch <- 100
17}()
18
19// İkinci goroutine: sayı al ve işle
20go func() {
21num:= <-ch
22fmt.Printf("Goroutine 2: %d aldım!\n", num)
23}()
24
25// Programın bitmemesi için bekle
26time.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 channel
2ch <- 1
3ch <- 2
4// Henüz kimse almadı ama sorun yok; buffer dolana kadar devam edebilir

Veri 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.

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz