Çoklu channel
- Go kursu
- Orta seviye
- Ders 14/80
- 4 dk
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
package main
import "fmt"
func main() {
// buraya yaz
}Örnek çözüm
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
select {
case v := <-ch1:
fmt.Println(v)
____:
fmt.Println("ch2")
}
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 |