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.
Görev
KolayBirden ç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) veName(string) alanlarına sahip birStatusyapısı oluşturun.Üç kanal alan bir
Monitorişlevi uygulayın:primary chan ServiceUpdate,backup chan ServiceUpdatevedone chan bool. Bu işlev, üç kanalı da aynı anda dinlemek içinselectkullanmalıdır:primarykanalından veri alındığında: biçimlendirilmişPrimary: [Name] is [Status]dizesini döndürünbackupkanalından veri alındığında: biçimlendirilmişBackup: [Name] is [Status]dizesini döndüründonekanalından veri alındığında:Monitoring stoppeddeğerini döndürün
Tek bir
CheckStatusalan ve engellemesiz bir kontrol gerçekleştirmek içinupdates chan ServiceUpdatedurumuyla birlikteselectkullanan birdefaultişlevi uygulayın:- Bir güncelleme varsa:
Update available: [Name]değerini döndürün - Güncelleme yoksa (varsayılan durum):
No updates pendingdeğ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,stopveyacheck.primary,backupvestopmodları 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ındanMonitorişlevini çağırıp sonucunu yazdırın.checkmodu için bir hizmet adı ve durumu ile kontrol öncesinde veri gönderilip gönderilmeyeceğini belirten bir bayrak (sendveyanosend) okuyun. Kapasitesi 1 olan arabelleğe alınmış bir kanal oluşturun. BayraksendiseCheckStatusçağrılmadan önce kanala bir güncelleme gönderin.CheckStatussonucunu yazdırın.
Aşağıdaki girdiler sağlanacaktır:
- 1. satır: Mod (
primary,backup,stopveyacheck) - 2. satır: Hizmet adı
- 3. satır: Hizmet durumu
- 4. satır (yalnızca
checkmodu için):sendveyanosend
Örneğin, şu veriler verildiğinde:
primary
Database
healthyÇıktınız şöyle olmalıdır:
Primary: Database is healthyVe şu veriler verildiğinde:
check
Cache
active
nosendÇıktınız şöyle olmalıdır:
No updates pendingKendin 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
}
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
1Go OOP Temelleri
Harici DosyalarGo Çalışma Alanı ve ModüllerPaketler ve İçe AktarmalarDışa Aktarılan ve Aktarılmayan İsimlerGo'da OOP'ye GirişSınıf Olarak Struct'larStruct'larda Metot TanımlamaPointer ve Değer AlıcılarStruct BaşlatmaYapıcı FonksiyonlarÖzet - Basit Hesap Makinesi4Arayüzler
Arayüzlere GirişÖrtük UygulamaSözleşme Olarak ArayüzBoş Arayüz (any)Tür OnaylamaTür SeçimiArayüz BileşimiStringer ve Error ArayüzleriÖzet - Şekil Hesaplayıcı7Kapsülleme
Dışa Aktarılan ve Aktarılmayan AlanlarPaket Seviyesinde KapsüllemeGetter ve Setter MetotlarıGo'da Bilgi GizlemeÖzet - Öğrenci Kayıtları10Generics (Go 1.18+)
Generics'e GirişTür ParametreleriTür KısıtlamalarıGeneric Struct'larGeneric Metotlar İçin Geçici ÇözümÖzet - Generic Koleksiyon13Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıAbstract Factory KalıbıObserver KalıbıStrategy Kalıbı2Türler ve Struct'lar: Derinlemesine İnceleme
Temel ve Bileşik TürlerÖzel Tür TanımlamalarıStruct EtiketleriAnonim Struct'larİç İçe Geçmiş Struct'larSıfır Değerler ve VarsayılanlarÖzet - Rehber5Kalıtım Yerine Kompozisyon
Go'da Neden Kalıtım YokStruct Gömme TemelleriMetot YükseltmeBirden Fazla Struct GömmeGömme vs AgregasyonGömülü Metotları GölgelemeÖzet - Çalışan Hiyerarşisi8Hata Yönetimi ve OOP
error ArayüzüÖzel Hata TürleriHata Sarmalama (fmt.Errorf)Sentinel Hatalarerrors.Is() ve errors.As()Panic, Defer ve RecoverÖzet - Dosya Ayrıştırıcı3İşaretçiler ve Bellek
Go'da İşaretçi TemelleriStruct İşaretçileriDeğer ile Geçme ve Referans ile Geçmenew() FonksiyonuGo'da Garbage CollectionÖzet - Linked List Oluşturucu6Go'da Polimorfizm
Interface'ler ile PolimorfizmGo'da Duck TypingInterface Karşılama KurallarıPolimorfik KoleksiyonlarDependency InjectionÖzet - Payment Processor9Eşzamanlılık ve OOP
Goroutine TemelleriKanallar ve İletişimTamponlu ve Tamponsuz KanallarSelect İfadesisync.Mutex ve sync.RWMutexsync.WaitGroupThread-Safe Struct TasarımıÖzet - Worker PoolKendi başına pratik yap: Online Go derleyicisi