Meydan okuma 1 - Eşzamanlılık
- Go kursu
- Orta seviye
- Ders 77/80
- 8 dk
Goroutine, channel ve WaitGroup'ı birleştiren bir program yazarsın.
Meydan okuma: paralel kelime sayacı
Birden çok metni aynı anda işleyip toplam kelime sayısını bulan bir program yazacaksın. Her metin ayrı bir goroutine'de sayılacak, sonuçlar bir kanalda toplanacak ve sync.WaitGroup ile tüm goroutine'lerin bitişi beklenecek.
metinler := []string{
"go hızlı ve basit",
"kanallar goroutine'leri bağlar",
"eşzamanlılık paralellik değildir",
}
// beklenen toplam: 10Kelimeleri saymak için strings.Fields kullan; birden çok boşluğu ve satır sonunu doğru işler.
Plan
1) sonuc := make(chan int, len(metinler)) — her goroutine için yer olan arabellek. 2) Her metin için wg.Add(1) + goroutine: sonuc <- len(strings.Fields(m)). 3) wg.Wait() sonra close(sonuc). 4) for n := range sonuc ile topla. Arabellek sayesinde Wait ve close aynı goroutine'de güvenle yapılabilir.
Uygulama Sayacı yaz
Plana göre programı yaz ve toplam kelime sayısını yazdır.
Başlangıç kodu
package main
import (
"fmt"
"strings"
"sync"
)
func main() {
// buraya yaz
}Örnek çözüm
package main
import (
"fmt"
"strings"
"sync"
)
func main() {
metinler := []string{
"go hızlı ve basit",
"kanallar goroutine'leri bağlar",
"eşzamanlılık paralellik değildir",
}
sonuc := make(chan int, len(metinler))
var wg sync.WaitGroup
for _, m := range metinler {
wg.Add(1)
go func(m string) {
defer wg.Done()
sonuc <- len(strings.Fields(m))
}(m)
}
wg.Wait()
close(sonuc)
toplam := 0
for n := range sonuc {
toplam += n
}
fmt.Println(toplam)
}Beklenen çıktı
10
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 <code>strings.Fields(" a b ")</code> kaç eleman döndürür?
- 2 Doğru cevap
- 5
- 3
- 7
Açıklama: Fields ardışık boşlukları tek ayırıcı sayar ve baştaki/sondaki boşlukları atar; Split(" ") ise boş parçalar üretirdi.
2 Kelimeleri ayır
n := len(strings.____(metin))
n := len(strings.Fields(metin))
Açıklama: strings.Fields metni boşluklara göre kelimelere ayırır.
3 Parça ve görev
| Kavram | Anlamı |
|---|---|
goroutine |
Bir metni sayar |
sonuc kanalı |
Sayıları taşır |
wg.Wait |
Hepsinin bitişini bekler |
range sonuc |
Toplar |