A.17. Map

Map adalah tipe data asosiatif yang ada di Go, berbentuk key-value pair. Untuk setiap data (atau value) yang disimpan, disiapkan juga key-nya. Key harus unik, karena digunakan sebagai penanda (atau identifier) untuk pengaksesan value yang bersangkutan.

Kalau dilihat, map mirip seperti slice, hanya saja indeks yang digunakan untuk pengaksesan bisa ditentukan sendiri tipe-nya (indeks tersebut adalah key).

A.17.1. Penggunaan Map

Cara menggunakan map cukup dengan menuliskan keyword map diikuti tipe data key dan value-nya. Agar lebih mudah dipahami, silakan perhatikan contoh di bawah ini.

var chicken map[string]int
chicken = map[string]int{}

chicken["januari"] = 50
chicken["februari"] = 40

fmt.Println("januari", chicken["januari"]) // januari 50
fmt.Println("mei",     chicken["mei"])     // mei 0

Variabel chicken dideklarasikan sebagai map, dengan tipe data key adalah string dan value-nya int. Dari kode tersebut bisa dilihat bagaimana cara penggunaan keyword map.

Kode map[string]int maknanya adalah, tipe data map dengan key bertipe string dan value bertipe int.

Default nilai variabel map adalah nil. Oleh karena itu perlu dilakukan inisialisasi nilai default di awal, caranya cukup dengan tambahkan kurung kurawal pada akhir tipe, contoh seperti pada kode di atas: map[string]int{}.

Cara menge-set nilai pada sebuah map adalah dengan menuliskan variabel-nya, kemudian disisipkan key pada kurung siku variabel (mirip seperti cara pengaksesan elemen slice), lalu isi nilainya. Contohnya seperti chicken["februari"] = 40. Sedangkan cara pengambilan value adalah cukup dengan menyisipkan key pada kurung siku variabel.

Pengisian data pada map bersifat overwrite, ketika variabel sudah memiliki item dengan key yang sama, maka value lama akan ditimpa dengan value baru.

Dasar Pemrograman Golang - Pengaksesan data map

Pada pengaksesan item menggunakan key yang belum tersimpan di map, akan dikembalikan nilai default tipe data value-nya. Contohnya seperti pada kode di atas, chicken["mei"] menghasilkan nilai 0 (nilai default tipe int), karena belum ada item yang tersimpan menggunakan key "mei".

A.17.2. Inisialisasi Nilai Map

Zero value dari map adalah nil, maka tiap variabel bertipe map harus di-inisialisasi secara explisit nilai awalnya (agar tidak nil).

var data map[string]int
data["one"] = 1
// akan muncul error!

data = map[string]int{}
data["one"] = 1
// tidak ada error

Nilai variabel bertipe map bisa didefinisikan di awal, caranya dengan menambahkan kurung kurawal setelah tipe data, lalu menuliskan key dan value di dalamnya. Cara ini sekilas mirip dengan definisi nilai array/slice namun dalam bentuk key-value.

// cara horizontal
var chicken1 = map[string]int{"januari": 50, "februari": 40}

// cara vertical
var chicken2 = map[string]int{
    "januari":  50,
    "februari": 40,
}

Key dan value dituliskan dengan pembatas tanda titik dua (:). Sedangkan tiap itemnya dituliskan dengan pembatas tanda koma (,). Khusus deklarasi dengan gaya vertikal, tanda koma perlu dituliskan setelah item terakhir.

Variabel map bisa di-inisialisasi dengan tanpa nilai awal, caranya menggunakan tanda kurung kurawal, contoh: map[string]int{}. Atau bisa juga dengan menggunakan keyword make dan new. Contohnya bisa dilihat pada kode berikut. Ketiga cara di bawah ini intinya adalah sama.

var chicken3 = map[string]int{}
var chicken4 = make(map[string]int)
var chicken5 = *new(map[string]int)

Khusus inisialisasi data menggunakan keyword new, yang dihasilkan adalah data pointer. Untuk mengambil nilai aslinya bisa dengan menggunakan tanda asterisk (*). Topik pointer akan dibahas lebih detail ketika sudah masuk A.23. Pointer.

A.17.3. Iterasi Item Map Menggunakan for - range

Item variabel map bisa di iterasi menggunakan for - range. Cara penerapannya masih sama seperti pada slice, pembedanya data yang dikembalikan di tiap perulangan adalah key dan value, bukan indeks dan elemen. Contohnya bisa dilihat pada kode berikut.

var chicken = map[string]int{
    "januari":  50,
    "februari": 40,
    "maret":    34,
    "april":    67,
}

for key, val := range chicken {
    fmt.Println(key, "  \t:", val)
}

Dasar Pemrograman Golang - Perulangan Map

A.17.4. Menghapus Item Map

Fungsi delete() digunakan untuk menghapus item dengan key tertentu pada variabel map. Cara penggunaannya, dengan memasukan objek map dan key item yang ingin dihapus sebagai parameter.

var chicken = map[string]int{"januari": 50, "februari": 40}

fmt.Println(len(chicken)) // 2
fmt.Println(chicken)

delete(chicken, "januari")

fmt.Println(len(chicken)) // 1
fmt.Println(chicken)

Item yang memiliki key "januari" dalam variabel chicken akan dihapus.

Dasar Pemrograman Golang - Hapus item Map

Fungsi len() jika digunakan pada map akan mengembalikan jumlah item.

A.17.5. Deteksi Keberadaan Item Dengan Key Tertentu

Ada cara untuk mengetahui apakah dalam sebuah variabel map terdapat item dengan key tertentu atau tidak, yaitu dengan memanfaatkan 2 variabel sebagai penampung nilai kembalian pengaksesan item. Return value ke-2 ini adalah opsional, isinya nilai bool yang menunjukkan ada atau tidaknya item yang dicari.

var chicken = map[string]int{"januari": 50, "februari": 40}
var value, isExist = chicken["mei"]

if isExist {
    fmt.Println(value)
} else {
    fmt.Println("item is not exists")
}

A.17.6. Kombinasi Slice & Map

Slice dan map bisa dikombinasikan, dan sering digunakan pada banyak kasus, contohnya seperti data array yang berisikan informasi siswa, dan banyak lainnya.

Cara menggunakannya cukup mudah, contohnya seperti []map[string]int, artinya slice yang tipe tiap elemen-nya adalah map[string]int.

Agar lebih jelas, silakan praktekan contoh berikut.

var chickens = []map[string]string{
    map[string]string{"name": "chicken blue",   "gender": "male"},
    map[string]string{"name": "chicken red",    "gender": "male"},
    map[string]string{"name": "chicken yellow", "gender": "female"},
}

for _, chicken := range chickens {
    fmt.Println(chicken["gender"], chicken["name"])
}

Variabel chickens di atas berisikan informasi bertipe map[string]string, yang kebetulan tiap elemen memiliki 2 key yang sama.

Jika anda menggunakan versi go terbaru, cara deklarasi slice-map bisa dipersingkat, tipe tiap elemen tidak wajib untuk dituliskan.

var chickens = []map[string]string{
    {"name": "chicken blue",   "gender": "male"},
    {"name": "chicken red",    "gender": "male"},
    {"name": "chicken yellow", "gender": "female"},
}

Dalam []map[string]string, tiap elemen bisa saja memiliki key yang berbeda-beda, sebagai contoh seperti kode berikut.

var data = []map[string]string{
    {"name": "chicken blue", "gender": "male", "color": "brown"},
    {"address": "mangga street", "id": "k001"},
    {"community": "chicken lovers"},
}