Sum
fonksiyonunu yapmak için yeni öğrendiğimiz for
'u kullanalım. Sum
sayıların olduğu bir array alacak ve toplamı dönecek.sum_test.go
isminde bir dosya oluşturun ve aşağıdakileri ekleyin:numbers := [5]int{1, 2, 3, 4, 5}
numbers := [...]int{1, 2, 3, 4, 5}
%v
fotmatlayıcısını değerleri "varsayılan" formatta yazdırması için kullandık.go test
komutunu çalıştırdığınızda derleyici ./sum_test.go:10:15: undefined: Sum
hatasını verecek.sum.go
içerisinesum_test.go:13: got 0 want 15 given, [1 2 3 4 5]
array[index]
sözdizimini kullanın. Bu durumda, for
kullanarak array üzerinde 5 kez iterasyon yaparak array içerisindeki her değeri sum
değişkenine ekliyoruz.range
array üzerinde iterasyon yapmanızı sağlar. range
, her iterasyonda indeksı ve indeksin değerini döner. (Blank Identifier) _
karakterini kullanarak indeks değerini yok sayabiliriz.[4]int
arrayini [5]int
bekleyen bir fonksiyona gönderirseniz, kod derlenmeyecektir. Bunlar farklı tiplerdir bu işlem aynı int
bekleyen bir fonksiyona string
göndermek gibidir.myArray := [3]int{1,2,3}
yerine mySlice := []int{1,2,3}
./sum_test.go:22:13: cannot use numbers (type []int) as type [5]int in argument to Sum
Sum
ın argümanını arrayden slicelara alarak var olan API'yı bozmak. Bunu yaptığımızda muhtemelen başkasının gününü mahfedeceğiz çünkü diğer testimiz derlenmeyecek!Sum
fonksiyonunu önceden düzenlemiştik - Tek yaptığımız arrayler yerine slicelar yazmak, ekstra bir değişikliğe gerek yok. Yeniden düzenleme aşamasında test kodumuzu ihmal etmememiz gerektiğini unutmayın - Sum
testlerimizi daha da geliştirebiliriz.go test -cover
SumAll
isminde yeni bir fonksiyona ihtiyacımız var. Bu fonksiyon çeşitli sayıda sliceı parametre olarak alacak, yeni bir slice dönecek ve bu slice her sliceın toplamını içerecek.SumAll([]int{1,2}, []int{0,9})
fonksiyonu []int{3, 9}
döndürmeliSumAll([]int{1,1,1})
fonskiyonu []int{3}
döndürmeli./sum_test.go:23:9: undefined: SumAll
SumAll
fonksiyonunu tanımlamalıyız../sum_test.go:26:9: invalid operation: got != want (slice can only be compared to nil)
got
ve want
slicelarını iterate etmesi için bir fonksiyon yazabilirsiniz ancak kolaylık olması için, herhangi iki değişkenin aynı olup olmadığını görmemizde kullanışlı olan, reflect.DeepEqual
kullanabiliriz.DeepEqual
fonksiyonuna erişebilmek için dosyanın en yukarısında import reflect
ekli olduğundan emin olun)reflect.DeepEqual
"type safe" güvenli tipte değildir - saçma bir şey yapsanızda kodunuz derlenecektir. Uygulamada bunu görmek için geçici olarak testi değiştirin:slice
ile bir string
'ı kıyaslamak. Bu kıyaslamayı yapmak mantıklı değil ancak test derleniyor! reflect.DeepEqual
slicelar ile diğer şeyleri kıyaslamak için kullanışlı, kullanırken dikkatli olmalısınız.sum_test.go:30: got [] want [3 9]
Sum
fonksiyonu ile toplamı hesaplamak, sonucu döneceğimiz olan slice'a eklemekmake
, üzerinde çalışacağımız numbersToSum
'ın len
ile elde ettiğimiz uzunluğunu kullanarak slice'ın kapasitesini belirlememizi sağlar.mySlice[N]
indeksteki değere erişebilir veya =
ile yeni bir değer atayabilirsiniz.mySlice[10] = 1
işlemini yapmaya çalışırsanız çalışma sırasında (runtime) hatası alırsınız.append
fonksiyonuna slice ve yeni bir değer göndererek yeni bir slice elde edebilirsiniz.sums
ile başlıyoruz ve Sum
fonksiyonunun sonucunu ekliyoruz.SumAll
fonksiyonunu SumAllTails
'a çevirmek, bu sayede her sliceın "tails" değerini hesaplayacağız. Tail (kuyruk), koleksiyonun ilk değeri ("kafa") haric tüm değerlerdir../sum_test.go:26:9: undefined: SumAllTails
SumAllTails
olarak yeniden isimlendir ve testi tekrar çalıştırsum_test.go:30: got [3 9] want [2 9]
slice[low:high]
. Eğer :
bir tarafında ki değeri kaldırırsanız o taraf haric her değeri kapsar. Bizin durumumuzda, numbers[1:]
ile "1. indeksten sona kadar" almasını söylüyoruz. Slicelar hakkında başka testler yazmak için biraz zaman harcamak ve daha aşina olmak için slice operatörüyle denemeler yapmak isteyebilirsiniz.myEmptySlice[1:]
bütün elemanlarını almasını söylerseniz ne olur?checkSums(t, got, "dave")
derleyici onların çalışmasını durduracak.append
kullanarak nasıl yenisini oluşturulacağılen
ile array veya slice'ın uzunluğunu elde etmeyireflect.DeepEqual
kullanmanın neden kullanışlı olduğu ama kodumuzun tip güvenliğini (type-safety) düşürebileceği[][]string
ile tanımlayabilirsiniz.