CodeBlanks Logo Icon CodeBlanks

Çoklu channel

select içinde birden çok case'i öğrenirsin.

Çoklu channel

select en güçlü yanını birden çok channel'ı beklerken gösterir. case v := <-ch1: ve case v := <-ch2: iki channel'ı aynı anda bekler; hangisi önce veri gönderirse o case çalışır.

Bu, bir goroutine'in birden çok kaynaktan veri toplamasını sağlar. Örneğin bir worker hem iş channel'ını hem de iptal channel'ını bekler; hangisi önce sinyal verirse ona göre davranır.

Çoklu channel deseni

Çoklu channel'da sıkça kullanılan desen: bir channel iş, diğeri iptal sinyali taşır. select her ikisini bekler; iptal gelirse goroutine çıkar, iş gelirse işler.

Bu desen context paketiyle birleşince güçlü bir iptal mekanizması oluşturur. Worker'lar zorla öldürülmez; kendiliklerinden kontrol edip çıkarlar.

Uygulama Çoklu channel bekle

main içine bir select { case ... case ... } bloğu ve fmt.Println ile çoklu hazır yazdır.

Başlangıç kodu

main.go
package main

import "fmt"

func main() {
    // buraya yaz
}

Örnek çözüm

main.go
package main

import "fmt"

func main() {
    ch1 := make(chan string)
    ch2 := make(chan string)
    go func() { ch1 <- "çoklu hazır" }()
    select {
    case m := <-ch1:
        fmt.Println(m)
    case m := <-ch2:
        fmt.Println(m)
    }
}

Beklenen çıktı

çoklu hazır

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 select'te birden fazla case hazırsa ne olur?

  • İlk case çalışır
  • Tümü sırayla çalışır
  • Hata verir
  • Rastgele biri çalışır Doğru cevap

Açıklama: rastgele biri çalışır. İlk case değil, rastgele seçim adildir.

2 Çoklu case

Soru
select {
case v := <-ch1:
    fmt.Println(v)
____:
    fmt.Println("ch2")
}
Cevap
select {
case v := <-ch1:
    fmt.Println(v)
case v := <-ch2:
    fmt.Println("ch2")
}

Açıklama: case channel işlemi içerir.

3 Çoklu channel desenini eşleştir

Kavram Anlamı
ch1 İş
ch2 İptal
select Bekleme
rastgele Adil seçim

Orta seviye bölümündeki tüm dersler