key
ile değerleri nasıl sakladığımıza ve hızlıca bakabildiğimizi inceleyeceğiz.key
'i kelime, value
'yu tanım olarak düşünebilirsiniz. Mapleri öğrenmenin kendi sözlüğümüz oluşturmaktan daha iyi yolu nedir?dictionary_test.go
içerisindemap
keywordu ile başlıyor ve iki tip gereklidir. İlki key tipi, []
içerisine yazılır. İkincisi value tipi,[]
'in sağına yazılır.go test
komutunu çalıştırdığımızda derleyici ./dictionary_test.go:8:9: undefined: Search
hatası ile başarısız olacaktır.dictionary.go
içerisindedictionary_test.go:12: got '' want 'this is just a test' given, 'test'
.map[key]
.assertStrings
yardımcısını oluşturdum.Search
'ü metod haline getirerek sözlüğümüzün kullanımını iyileştirebiliriz.dictionary_test.go
içerisinde:Dictionary
tipini kullanmaya başladık. Sonra Dictionary
instanceında Search
'ü çağırdık.assertStrings
değiştirmemize gerek yok.dictionary.go
içerisinde:map
'i wrapper eden Dictionary
tipini oluşturduk. Özel tip tanımı ile Search
metodunu oluşturabiliriz.Error
tipi döndürülür.Error
ler .Error()
metodu ile stringe dönüştürülebilir. Ayrıca nil
durumdunda assertStrings
'i if
ile .Error()
çağırmaktan koruyoruz.dictionary_test.go:22: expected to get an error.
Search
fonksiyonundaki sihirli hatayı değişkene atayarak kurtulabiliriz. Daha iyi bir testimizin olmasını sağlayacak.ErrNotFound
kullanmaya başladık bu sayede ileride hata mesajını değiştirsek bile testimiz başarısız olmayacaktır.Search
fonksiyonunun kullanışlı hale getiriyoruz.dictionary.go
içerisinde&myMap
)Map value'su runtime.hmap structurena bir pointerdır.
nil
olabilir. nil
map okuğunuzda boş bir map gibi davranır ama nil
mape yazma işlemi çalışma anı (runtime) hatasına sebep olur. Mapler hakkında daha fazlasını burada okuyabilirsiniz.make
keywordünü oluşturabilirsiniz:hash map
oluşturur ve dictionary
'e işaret eder. Bu sayede çalışma zamanı (runtime) hatası almazsınız.Add
iyi gözüküyor. Ancak, Eklemeye çalıştığımız değer zaten mevcutsa ne olacağını düşünmedik!Add
var olan değeri değiştirmemeli. Sadece sözlüğe yeni kelimeyi eklemeli.Add
fonksiyonun hata ,ErrWordExists
, döndürmesi için değiştirdik bu sayede yeni hata değişkenine karşı doğrulama yapıyoruz. Ayrıca önceki testi, assertError
fonksiyonunda olduğu gibi nil
hatası için düzenledik.Add
için bir değer dönmüyoruz.dictionary.go
içindenil
dönüyoruz.switch
ifadesini kullanıyoruz. switch
e sahip olmak Search
'ün ErrNotFound
'tan başka hata dönmesi durumlar için ekstra güvenlik sağlar.error
interfacinden implemente eden kendi DictionaryErr
tipimizi zorunlu kılıyor. Dave Cheney'nin hazırladığı muhteşem makaleden daha fazlasını okuyabilirsiniz. Basitçe söylemek gerekirse, hataları tekrar kullanılabilir ve değiştirilemez hale getirir.Update
fonksiyonunu oluşturalım.Update
, Add
çok yakından ilişkili ve sonraki implementasyonumuz olacak.Add
ile olan issueyu düzelttiğimizde bunu nasıl yapacağımızı görmüştük. Add
e gerçekten benzeyen bir şey implemente edelim.Add
ile aynı sorunu yaşıyoruz. Eğer yeni bir kelime gönderirsek Update
onu sözlüğe ekleyecek.error
değeri dönmesi için Update
'i değiştirdik.nil
error dönüyoruz.dictionary
i güncelleme ve hata döndürme dışında Add
ile neredeyse aynı.ErrNotFound
'u tekrar kullanabilirdik ve yenrine bir hata eklemezdik. Ancak, bir güncelleme başarısız olduğunda kesin bir hataya sahip olmak genellikle daha iyidir.ErrNotFound
oluştuğunda kullanıcıyı yeniden yönlendirebilirsiniz amaErrWordDoesNotExist
hatasını görüntülersiniz..
Delete
fonksiyonu oluşturalım.Dictionary
ve bir kelime oluşturur daha sonra silindiğini kontrol eder.go test
komutunu çalıştırarak :delete
fonksiyonuna sahip. İki argüman alır. İlki map ve ikincisi kaldırılacak olan key.delete
fonksiyonu bir şey döndürmez ve Delete
metodunu aynı düşünceye dayandırdık. Olmayan bir değeri silmenin bir etkisi olmadığından, Update
ve Add
gibi API'yı hatalar ile karmaşıklaştırmamıza gerek yok.