Menu
Coddy logo textTech

Select İfadesi

Coddy'nin GO Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 62 / 107.

select ifadesi, bir goroutine'in aynı anda birden fazla kanal işlemini beklemesini sağlar. switch ifadesine benzer, ancak her case bir kanal gönderme veya alma işlemi içerir. Birden fazla kanal hazır olduğunda select bunlardan birini rastgele seçer.

func main() {
    ch1 := make(chan string)
    ch2 := make(chan string)
    
    go func() { ch1 <- "from channel 1" }()
    go func() { ch2 <- "from channel 2" }()
    
    select {
    case msg1 := <-ch1:
        fmt.Println(msg1)
    case msg2 := <-ch2:
        fmt.Println(msg2)
    }
}

select olmadan, ch1 kanalından alma işlemi veri gelene kadar engellenir ve bu da ch2 kanalındaki verilerin kaçırılmasına neden olabilir. select ile hangi kanal önce veri alırsa o kanal işlenir.

default durumu, select ifadesini engellemesiz hale getirir. Hiçbir kanal hazır değilse hemen çalışır:

select {
case msg := <-messages:
    fmt.Println("Received:", msg)
default:
    fmt.Println("No message available")
}

Yaygın bir desen, belirtilen sürenin ardından bir değer alan bir kanal döndüren time.After ile zaman aşımını select ile birleştirir:

select {
case result := <-ch:
    fmt.Println("Got result:", result)
case <-time.After(2 * time.Second):
    fmt.Println("Timeout!")
}

Bu, bir kanal işlemi hiçbir zaman tamamlanmayabileceğinde programınızın sonsuza kadar beklemesini önler.

challenge icon

Görev

Kolay

Birden çok eşzamanlı veri kaynağını işlemek için select ifadesini kullanan bir hizmet izleyicisi oluşturalım. İzleyiciniz aynı anda farklı hizmet kanallarını dinleyecek ve veri geldiğinde ya da herhangi bir güncelleme bulunmadığında uygun şekilde yanıt verecek.

kodunuzu iki dosyada düzenleyeceksiniz:

  • monitor.go: select tabanlı kanal işleme ile hizmet izleme mantığınızı tanımlayın.

    ServiceUpdate (string) ve Name (string) alanlarına sahip bir Status yapısı oluşturun.

    Üç kanal alan bir Monitor işlevi uygulayın: primary chan ServiceUpdate, backup chan ServiceUpdate ve done chan bool. Bu işlev, üç kanalı da aynı anda dinlemek için select kullanmalıdır:

    • primary kanalından veri alındığında: biçimlendirilmiş Primary: [Name] is [Status] dizesini döndürün
    • backup kanalından veri alındığında: biçimlendirilmiş Backup: [Name] is [Status] dizesini döndürün
    • done kanalından veri alındığında: Monitoring stopped değerini döndürün

    Tek bir CheckStatus alan ve engellemesiz bir kontrol gerçekleştirmek için updates chan ServiceUpdate durumuyla birlikte select kullanan bir default işlevi uygulayın:

    • Bir güncelleme varsa: Update available: [Name] değerini döndürün
    • Güncelleme yoksa (varsayılan durum): No updates pending değerini döndürün
  • main.go: Kanalları ayarlayın ve hem engelleyen hem de engellemeyen select davranışını gösterin.

    Çalıştırılacak senaryoyu belirleyen bir modu girdiden okuyun: primary, backup, stop veya check.

    primary, backup ve stop modları için ayrıca bir hizmet adı ve durumu okuyun. Üç kanalı oluşturun, moda göre uygun kanala veri gönderen bir goroutine başlatın, ardından Monitor işlevini çağırıp sonucunu yazdırın.

    check modu için bir hizmet adı ve durumu ile kontrol öncesinde veri gönderilip gönderilmeyeceğini belirten bir bayrak (send veya nosend) okuyun. Kapasitesi 1 olan arabelleğe alınmış bir kanal oluşturun. Bayrak send ise CheckStatus çağrılmadan önce kanala bir güncelleme gönderin. CheckStatus sonucunu yazdırın.

Aşağıdaki girdiler sağlanacaktır:

  • 1. satır: Mod (primary, backup, stop veya check)
  • 2. satır: Hizmet adı
  • 3. satır: Hizmet durumu
  • 4. satır (yalnızca check modu için): send veya nosend

Örneğin, şu veriler verildiğinde:

primary
Database
healthy

Çıktınız şöyle olmalıdır:

Primary: Database is healthy

Ve şu veriler verildiğinde:

check
Cache
active
nosend

Çıktınız şöyle olmalıdır:

No updates pending

Kendin dene

package main

import (
	"fmt"
)

func main() {
	var mode string
	fmt.Scanln(&mode)

	var serviceName string
	fmt.Scanln(&serviceName)

	var serviceStatus string
	fmt.Scanln(&serviceStatus)

	// TODO: Farklı modları işle: "primary", "backup", "stop", "check"
	
	// "primary", "backup", "stop" modları için:
	// - Üç kanal oluştur: primary, backup, done
	// - Uygun kanala veri gönderen bir goroutine başlat
	// - Monitor'ü çağır ve sonucu yazdır
	
	// "check" modu için:
	// - Ek bayrağı oku ("send" veya "nosend")
	// - Kapasitesi 1 olan tamponlu bir kanal oluştur
	// - Bayrak "send" ise, kanala bir güncelleme gönder
	// - CheckStatus'u çağır ve sonucu yazdır
	
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online Go derleyicisi