Map (Eşleme)
Map’ler anahtarı benzersiz olmak üzere, anahtar-değer (key-value) eşlemeleridir. Bir map aşağıdaki şekilde tanımlanır.
map[AnahtarTipi]DeğerTipiÖrnek bir map değişkeni tanımlayalım.
var cityPopulation map[string]uintYukarıdaki örneğe göre tanımlanan cityPopulation değişkeni, bir anahtar olarak string, değer olarak ise uint tipinde değer alan bir map’tir.
Map’i tanımladığımız esnada içeriğini girmek için,
cityPopulation := map[string]uint{ "İstanbul": 15_460_000, "Ankara": 5_663_000,}
// Yeni bir alan eklemek veya varolan bir alanın// değerini değiştirmek içincityPopulation["Bursa"] = 2_995_000Değeri atanmamış map değişkenin varsayılan değeri nil’dir. Mevcut değer nil iken map üzerinde bir alan oluşturulamaz.
Örnek olarak:
var cityPopulation map[string]uint
cityPopulation["İstanbul"] = 15_460_000 // panic: assignment to entry in nil mapBunun için boş olsa da map’i init etmemiş gerekir. Bunun için 2 yöntem vardır.
// 1. yöntem -> boş değer atayarak init etmekcityPopulation := map[string]uint{}
// 2. yöntem -> make kullanarak init etmekcityPopulation := make(map[string]uint)Bellekte belirli bir alan kadar ön tahsis yapmak için, make kullanırken opsiyonel boyut belirtebiliriz.
cityPopulation := make(map[string]uint, 10)Map’lerin de uzunlukları vardır. len fonksiyonu ile bir map’in uzunluğu öğrenilebilir.
cityPopulation := map[string]uint{ "İstanbul": 15_460_000, "Ankara": 5_663_000,}
fmt.Println(len(cityPopulation)) // 2Map’ten bir alanı silmek için delete fonksiyonu kullanılır.
cityPopulation := map[string]uint{ "İstanbul": 15_460_000, "Ankara": 5_663_000,}
fmt.Println(cityPopulation) // map[Ankara:5663000 İstanbul:15460000]
delete(cityPopulation, "İstanbul")
fmt.Println(cityPopulation) // map[Ankara:5663000]Bir map içerisindeki tüm alanları silmek için clear fonksiyonunu kullanabiliriz. clear fonksiyonu map’i varsayılan değeri olan nil yapmak yerine boş haline döndürür.
cityPopulation := map[string]uint{ "İstanbul": 15_460_000, "Ankara": 5_663_000,}fmt.Println(cityPopulation) // map[Ankara:5663000 İstanbul:15460000]
clear(cityPopulation)fmt.Println(cityPopulation) // map[]Konu map üzerinden değer okumaya geldiğinde bunun için aşağıdaki şekilde ilerleyebiliriz.
cityPopulation := map[string]uint{ "İstanbul": 15_460_000, "Ankara": 5_663_000,}fmt.Println(cityPopulation["İstanbul"]) // 15460000Map içerisinde bir anahtara kayıtlı değer bulunmadığında, değer tipinin varsayılan değerinde sonuç alırız.
cityPopulation := map[string]uint{ "İstanbul": 15_460_000, "Ankara": 5_663_000,}fmt.Println(cityPopulation["İzmir"]) // 0Örneğe göre map içerisinde İzmir alanı bulunmadığı için uint tipinin varsayılan değeri olan 0 değeri ile karşılaşıyoruz.
Burada şu iki soruyu sorabiliriz.
Map üzerinde İzmir alanı için,
0sonucunu, değeri0olarak atandığı için mi alıyoruz?,- yoksa
0sonucunu, değeri hiç atanmadığı için mi varsayılan olarak mı alıyoruz?
Bu durumdan hangisinin gerçekleştiğini anlamak için comma ok deyimini kullanabiliriz.
cityPopulation := map[string]uint{ "İstanbul": 15_460_000, "Ankara": 5_663_000, "Bursa": 0,}
bursaPopulation, ok := cityPopulation["Bursa"] // 0, trueizmirPopulation, ok := cityPopulation["İzmir"] // 0, falseYukarıdaki örneğe göre, Bursa’nın nüfusu öğrenilmek istendiğinde, Bursa anahtarı için 0 değerinde bir kayıt olduğu için, bursaPopulation değişkeninin değeri 0 olur ve ok değişkeninin değeri cityPopulation map’inde Bursa alanı bulunduğu için true olur.
cityPopulation map’inin içerisinde İzmir alanı bulunmadığı için, izmirPopulation değişkeninin değeri uint tipinin varsayılan değeri olduğu için 0 olur ve ok değişkeninin değeri, map içerisinde İzmir alanı olmadığı için false olur.