Meydan okuma 3 - Test + benchmark
- Go kursu
- Orta seviye
- Ders 79/80
- 8 dk
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-sekerPlan
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
package main
import (
"fmt"
"strings"
"unicode"
)
func main() {
// buraya yaz
}Örnek çözüm
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?
if unicode.____(r) || unicode.IsDigit(r) {
b.WriteRune(r)
}
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 |