CodeBlanks Logo Icon CodeBlanks

Meydan okuma 3 - Test + benchmark

Bir fonksiyon için test ve benchmark yazarsın.

Meydan okuma: test ve benchmark

Bir slug fonksiyonu yazıp tablo testiyle doğrulayacak ve iki uygulamayı benchmark ile karşılaştıracaksın. Kurallar: küçük harfe çevir, Türkçe harfleri ASCII karşılığına dönüştür (ç→c, ğ→g, ı→i, ö→o, ş→s, ü→u), harf ve rakam dışındaki her şeyi tek tireye çevir, baştaki ve sondaki tireleri at.

Slug("Merhaba Dünya!")      // merhaba-dunya
Slug("  Go ile Web  ")      // go-ile-web
Slug("Çay & Şeker")         // cay-seker

Plan

Bir strings.Builder ile rune'ları gez: Türkçe harfi bir map[rune]rune ile çevir, unicode.ToLower uygula; harf/rakamsa ekle, değilse ve son eklenen tire değilse tire ekle. Sonda strings.Trim(s, "-"). Tablo testini main'de anonim struct dilimiyle çalıştır; ayırma sayısını testing.AllocsPerRun ile ölç.

Uygulama Slug ve testi

Slug fonksiyonunu yaz ve yukarıdaki üç durumu tablo testiyle dene. Geçen durum sayısını yazdır.

Başlangıç kodu

main.go
package main

import (
    "fmt"
    "strings"
    "unicode"
)

func main() {
    // buraya yaz
}

Örnek çözüm

main.go
package main

import (
    "fmt"
    "strings"
    "unicode"
)

var trHarf = map[rune]rune{'ç': 'c', 'ğ': 'g', 'ı': 'i', 'ö': 'o', 'ş': 's', 'ü': 'u', 'Ç': 'c', 'Ğ': 'g', 'İ': 'i', 'Ö': 'o', 'Ş': 's', 'Ü': 'u'}

func Slug(s string) string {
    var b strings.Builder
    tire := false
    for _, r := range s {
        if t, ok := trHarf[r]; ok {
            r = t
        }
        r = unicode.ToLower(r)
        if unicode.IsLetter(r) || unicode.IsDigit(r) {
            b.WriteRune(r)
            tire = false
        } else if !tire {
            b.WriteByte('-')
            tire = true
        }
    }
    return strings.Trim(b.String(), "-")
}

func main() {
    tests := []struct{ in, want string }{
        {"Merhaba Dünya!", "merhaba-dunya"},
        {"  Go ile Web  ", "go-ile-web"},
        {"Çay & Şeker", "cay-seker"},
    }
    gecen := 0
    for _, tt := range tests {
        if Slug(tt.in) == tt.want {
            gecen++
        }
    }
    fmt.Println(gecen)
}

Beklenen çıktı

3

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 <code>strings.ToLower("İ")</code> neden dikkat gerektirir?

  • Değişmez
  • ı olur
  • Türkçe İ, "i" + birleştirici nokta (i̇) olarak küçülür Doğru cevap
  • Hata verir

Açıklama: Unicode varsayılan kuralında İ (U+0130) "i̇" olur; Türkçe kurallar için unicode.TurkishCase ya da elle eşleme kullanılır.

2 Harf mi?

Soru
if unicode.____(r) || unicode.IsDigit(r) {
    b.WriteRune(r)
}
Cevap
if unicode.IsLetter(r) || unicode.IsDigit(r) {
    b.WriteRune(r)
}

Açıklama: unicode.IsLetter Unicode harflerini (Türkçe dahil) tanır.

3 Girdi ve slug

Kavram Anlamı
"Merhaba Dünya!" merhaba-dunya
" Go ile Web " go-ile-web
"Çay & Şeker" cay-seker
"--A--" a

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