CodeBlanks Logo Icon CodeBlanks

Meydan okuma 1 - Eşzamanlılık

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: 10

Kelimeleri 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

main.go
package main

import (
    "fmt"
    "strings"
    "sync"
)

func main() {
    // buraya yaz
}

Örnek çözüm

main.go
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

Soru
n := len(strings.____(metin))
Cevap
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

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