Maps

map ifadeleri, eleman çiftlerinin sıralanmamış koleksiyonlarından oluşan özelleşmiş veri yapılarıdır. Bir key (anahtar) ve bir value (değer) setinden oluşurlar.

Ayrıca associative array ve dictionary isimleriyle de bilinirler.Diğer programlama dillerinde bu yapılar hash ,dictionary, HashTable gibi isimlerle de bilinirler.

Değerleri hızlı bir şekilde aramak için idealdirler. Bir key verildiğinde value hızlı bir şekilde temin edilir.

Maplerin Tanımlanması

Bir map yapısı aşağıdaki formda tanımlanır.

var map1 map[keytype]valuetype

Bir örnek vermek gerekirse :

var map1 map[string]int

DİKKAT: Anahtar key ifadeleri veri tipi olarak string, float, int gibi yapılar alabilir. Fakat, array, slice,struct gibi ifadeler key olarak kullanılmazlar.

Bir map ifadesi dinamik olarak genişletilebilir. Tanımlandığı sırada aldığı değer miktarı eğer başlangıçta belirtilmediyse istenilen miktarda öğe eklenebilir.

map ifadelerinin farklı kullanım alanları mevcuttur. Özellikle birden çok fonksiyonu değer ataması yoluyla şubelendirmek ve kollara ayırmak için de ideal yapılardır.

package main

import "fmt"

func main() {
	// map1 isimli bir map
	var map1 map[string]int


  //map2 isimli bir map
	var map2 = map[string]int{"one": 1, "two": 2}

	// yeni bir map oluştur
	mapCreated := make(map[string]float32)

	// map1 i map2 ye kopyala
	map1 = map2

	// anahtar ve değer ciftleri ata
	mapCreated["key1"] = 4.5
	mapCreated["key2"] = 3.14159

	// anahtar ve değer ciftleri ata
	map1["two"] = 3

	// Ekrana görselleri yazdır
	fmt.Print(map1, "\n")
	fmt.Print(map2, "\n")
	fmt.Print(mapCreated, "\n")
}

Kodu parçalara ayırarak inceleyelim :

	// map1 isimli bir map
	var map1 map[string]int

Burada map1 isimli bir map ifadesi oluşturuyoruz.key değerleri string ve value değerleri int olacak şekilde veri girileceğini belirtiyoruz.


  //map2 isimli bir map
	var map2 = map[string]int{"one": 1, "two": 2}

Burada ise map2 isimli bir map oluşturuyoruz. key ifadeleri string ve value ifadeleri int olacağını belirtiyoruz. {} işareti ile değer çiftlerini atıyoruz.

	// yeni bir map oluştur
	mapCreated := make(map[string]float32)

Burada make() ile boş bir map oluşturuyoruz. mapCreated isimli bu boş map 'in key değerleri string ve value değerleri float32 olacak şekilde düzenleme yapıyoruz.

	// map1 i map2 ye kopyala
	map1 = map2

Burada ise map1 isimli boş map ifadesinin içerisine map2 deki ifadeleri kopyalıyoruz.

	// anahtar ve değer ciftleri ata
	mapCreated["key1"] = 4.5
	mapCreated["key2"] = 3.14159

	// anahtar ve değer ciftleri ata
	map1["two"] = 3

Daha önceden boş bir map olarak oluşturduğumuz mapCreated içerisine key1 ve key2 anahtarlarına değer atayarak giriş yapıyoruz.Aynı işlemi map1 için de tekrarlıyoruz.

	fmt.Print(map1, "\n")
	fmt.Print(map2, "\n")
	fmt.Print(mapCreated, "\n")

Oluşturduğumuz map ifadelerini fmt.Print() ifadesi yardımıyla görüntülüyoruz ve aşağıdaki gibi bir ifade ortaya çıkartıyoruz:

	map[one:1 two:3]
	map[one:1 two:3]
	map[key1:4.5 key2:3.14159]

Map İfadelerinin Kapasitesi

array ifadelerinin aksine map ifadeleri değer eklendikçe artacak şekilde tasarlanmıştır. Eğer siz bir kapasite sınırı koymak isterseniz bu opsiyon için aşağıdaki yapıyı kullanmanız gerekir.

make(map[keytype]valuetype, cap)

Burada make() ile map ifadesi oluştururken aşağıdaki parametleri belirtiyoruz

  • keytype : Anahtar ifadesinin veri türü
  • valuetype : Değer ifadesinin veri türü
  • cap : Kapasite ifadesinin sayısal miktarı

Kapasite miktarını belirlemek bir diziye girilebilecek maksimum key:value çiftini belirleyeceği için performans uygulamalarında kullanılır.

Örnek ifade:

package main

import "fmt"

func main(){
	trakya := make(map[string]int,5)

	trakya["Edirne"] = 22
	trakya["Kırklareli"] = 39
	trakya["İstanbul"] = 34
	trakya["Tekirdağ"] = 59
	trakya["Çanakkale"] = 16

	fmt.Print(trakya)
}

Bu ifadeyi çalıştırdığımızda aşağıdaki şekilde bir çıktı elde ederiz:

map[Edirne:22 Kırklareli:39 Tekirdağ:59 Çanakkale:16 İstanbul:34]%

slice İfadelerinin Veri Ataması

Bir map ifadesinde value lar int, float32, string gibi primitive type olarak yazılabilirler. Değer ifadeleri ise string, int,float32 gibi primitive type ifadelerin yanı sıra slice, array,map,func,struct gibi complex type ifadeler de olabilir.


// []int slice ifadesi döndürür
mp1 := make(map[int][]int)

// *[]int slice ifadesi döndürür
mp2 := make(map[int]*[]int)

Yukarıdaki örneklerdeki ifadlerde value ifadeleri slice tipinde değer alırlar.

map ifadelerinden öğe silinmesi

Bir map ifadesinden öğe silmek için delete() fonksiyonunu kullanırız. Kullanım şekli aşağıdaki gibidir :


delete(mapName, mapKey)

Örnek ifademiz ile konuyu pekiştirelim.


func DeleteItemMap() {
	cities := map[string]int{
		"Edirne":     22,
		"Bursa":      16,
		"Kırklareli": 39,
		"Tekirdağ":   59,
		"Çanakkale":  17,
	}

	fmt.Printf("%v \n ", cities)

	// cities : mapName  ve Tekirdağ : mapKey
	delete(cities, "Tekirdağ")

	fmt.Printf("%v \n ", cities)
}

Bu ifadede "Tekirdağ" isimli değişkeni cities isimli map ifademizden sildik. Ekran çıktımız ise aşağıdaki şekilde olmuştur.


map[Bursa:16 Edirne:22 Kırklareli:39 Tekirdağ:59 Çanakkale:17]
map[Bursa:16 Edirne:22 Kırklareli:39 Çanakkale:17]%