Iterasyon
Go'da tekrarlı işler için for'a ihtiyacınız var. Go içerisinde while, do, until anahtar kelimeleri yoktur sadece for kullanabilirsiniz ve bu iyi bir şey!
Hadi bir karakteri 5 kez tekrar eden bir fonksiyon için test yazalım
Şimdiye kadar yeni bir şey yok, bu yüzden pratik yapmak için kendiniz yazmaya çalışın.

İlk olarak test yaz

1
package iteration
2
3
import "testing"
4
5
func TestRepeat(t *testing.T) {
6
repeated := Repeat("a")
7
expected := "aaaaa"
8
9
if repeated != expected {
10
t.Errorf("expected %q but got %q", expected, repeated)
11
}
12
}
Copied!

Dene ve testi çalıştır

./repeat_test.go:6:14: undefined: Repeat

Testin çalışması için minimum kodu yaz ve başarısız test çıktılarını kontrol et

Disiplini koruyun! Testin düzgün bir şekilde başarısız olması için şu anda yeni bir şey bilmenize gerek yok.
Yapmanız gereken tek şey kodu derlemek için yeterli değişikliği yapmak, bu sayede kodunuzun iyi yazıldığını kontrol etmek için test edebilirsiniz.
1
package iteration
2
3
func Repeat(character string) string {
4
return ""
5
}
Copied!
Bazı basit problemler için test yazacak kadar Go bilmek hoş değil mi? Bu, artık production koduyla istediğiniz kadar oynayabileceğiniz ve umduğunuz gibi davranmasını bildiğiniz anlamına gelir.
repeat_test.go:10: expected 'aaaaa' but got ''

Testi geçecek kadar kod yaz

for sözdizimi çok dikkat çekici değildir ve çoğu C benzeri dillerde olduğu gibidir.
1
func Repeat(character string) string {
2
var repeated string
3
for i := 0; i < 5; i++ {
4
repeated = repeated + character
5
}
6
return repeated
7
}
Copied!
C, Java veya JavaScript dillerinin aksine, for döngüsünün 3 bileşenini saran parantezler yoktur ve süslü parantezler { } her zaman zorunludur. Muhtemelen şu satırda ne olduğunu merak ediyorsunuz.
1
var repeated string
Copied!
Değişken tanımlamak için bir süre := kullanmıştık ancak := basitçe her iki adım için kısa yol. Burada sadece string değişkeni tanımladık. Aynı zamanda var ile fonksiyon tanımlayabildiğimizi ileride göreceğiz.
Testi çalıştırın ve geçtiğini görün.
for döngüsünün farklı kullanımlarını burada bulabilirsiniz.

Refactor

Şimdi düzenlemenin ve yeni bir atama += operatörünü tanıtma zamanı.
1
const repeatCount = 5
2
3
func Repeat(character string) string {
4
var repeated string
5
for i := 0; i < repeatCount; i++ {
6
repeated += character
7
}
8
return repeated
9
}
Copied!
+= operatörü "ekle ve ata operatörü" olarak bilinir. Sağdaki değeri soldaki depere ekler ve sonucu soldaki değere atar. Integerlar gibi diğer tiplerlede çalışır.

Kıyaslama

Go'da benchmark (kıyaslama) yazmak dilin diğer birinci sınıf özelliklerindendir ve test yazmaya çok benzer.
1
func BenchmarkRepeat(b *testing.B) {
2
for i := 0; i < b.N; i++ {
3
Repeat("a")
4
}
5
}
Copied!
Kodun teste çok benzediğni sizde göreceksiniz.
testing.B şifreli olarak adlandırılan b.N'e erişmenizi sağlar.
Kıyaslama (benchmark) kodu çalıştırıldığında b.N kere çalışır ve ne kadar sürdüğünü ölçer.
Kodun çalışma süresni önemsememelisiniz, framework bu durum için neyin "iyi" bir değer olduğuna karar verecek ve bazı iyi sonuçlar elde etmeniz için size izin verecek.
Benchmarkı çalıştırmak için go test -bench=. (Windows Powershell'de iseniz go test -bench=".")
1
goos: darwin
2
goarch: amd64
3
pkg: github.com/quii/learn-go-with-tests/for/v4
4
10000000 136 ns/op
5
PASS
Copied!
136 ns/op fonksiyonumuzun çalışma süresinin ortalama 136 nanosaniye (benim bilgisayarımda) sürdüğünü gösteriri. Bu iyi bir değer! Bunu test etmek için 10000000 kere çalıştı.
NOT Benchmarklar varsayılan olarak ardışık çalışır.

Alıştırmaları yap

  • Testi değiştir, bu sayede çağıran kişi karakterin kaç kez tekrarlanacağını belirleyebilir ve sonradan kodu düzeltebilir
  • Fonksiyonunu dokümente etmek için ExampleRepeat yaz
  • Strings paketine bir göz atın. Yararlı olabileceğini düşündüğünüz fonksiyonları bulun ve burada yaptığımız gibi testler yazarak bunları deneyin. Standard kütüphaneyi öğrenmek için zaman ayırmak ileride gerçekten işe yarayacak.

Özetlersek

  • Daha fazla TDD pratiği
  • for öğrenildi
  • Benchmarkın (kıyaslama) nasıl yazıldığı öğrenildi
Bu sayfa @bariscanyilmaz tarafından çevrildi.
Last modified 2mo ago