# Map

Map adalah tipe data pada Go berbentuk *key-value pair*. `map` mirip seperti slice, hanya saja indeks yang digunakan untuk pengaksesan bisa ditentukan sendiri tipe-nya (indeks tersebut adalah key).

```go
package main

import (
	"fmt"
)

func main() {
	var batch map[string]int

	batch["adorable"] = 20
	batch["brilliant"] = 10

	fmt.Println("Jumlah anggota batch adorable", batch["adorable"])
	fmt.Println("Jumlah anggota batch brilliant", batch["brilliant"])
}
```

![Error pada output program](/files/-MSSh2INDJhSBooahQWU)

Pada kode di atas jika dijalankan akan muncuk error ini karena pada `map` nilai default adalah `nil` sehingga kita harus membuat inisialisasi nilai default di awal seperti ini:

```go
package main

import (
	"fmt"
)

func main() {
	var batch map[string]int
	batch = map[string]int{} // Inisialisasi nilai default
	
	batch["adorable"] = 20
	batch["brilliant"] = 10

	fmt.Println("Jumlah anggota batch adorable", batch["adorable"])
	fmt.Println("Jumlah anggota batch brilliant", batch["brilliant"])
}

```

![Berhasil menampilkan data yang ada pada map](/files/-MSShc11Pk8CkK0pyP3Y)

### Inisialisasi Nilai `map`

Kita juga bisa langsung memasukkan nilai pada variabel bertipe `map` dengan menggunakan literal `{}` seperti berikut ini:

```go
package main

import (
	"fmt"
)

func main() {
	batch := map[string]int{"adorable": 20, "brilliant": 10}

	fmt.Println("Jumlah anggota batch adorable", batch["adorable"])
	fmt.Println("Jumlah anggota batch brilliant", batch["brilliant"])
}
```

![Output program berisi nilai map pada variabel batch](/files/-MSSi_VwpU3qao1xoIkA)

### Looping pada `map`

Kita bisa menggunakan `for` - `range` untuk looping pada `map` . Cara penerapannya masih sama seperti pada slice, pembedanya data yang dikembalikan di tiap perulangan adalah key dan value, bukan indeks dan elemen.

```go
package main

import (
	"fmt"
)

func main() {
	batch := map[string]int{"adorable": 20, "brilliant": 10, "creative": 15}

	for key, val := range batch {
		fmt.Println(key, ":", val)
	}
}
```

![Menampilkan key dan value dari hasil looping variabel batch](/files/-MSSjwbiKgHgW5YTjyO2)

### Mutating Maps

Berikut adalah beberapa hal yang dapa kita lakukan pada `map` :

#### Insert or Update `map`

Untuk melakukan insert dan update data, kita dapat menggunakan cara berikut ini:

```go
m[key] = elem
```

Kita lihat bahwa kita harus mengetahui `key` dari `map` dan meng-assign nilai ke dalam `map` .

```go
package main

import (
	"fmt"
)

func main() {
	batch := map[string]int{"adorable": 20, "brilliant": 10, "creative": 15}

	// Update value dari key "adorable"
	batch["adorable"] = 8
	fmt.Println(batch["adorable"])
}
```

![Mengupdate value dari key adorable ](/files/-MSSsFKud7df9X6TCyNk)

### Retrieve the element

Kita dapat menyimpan `value` dari `key` pada `map` dengan cara seperti berikut ini:

```
elem = m[key]
```

```go
package main

import (
	"fmt"
)

func main() {
	batch := map[string]int{"adorable": 20, "brilliant": 10, "creative": 15}

	a := batch["adorable"]
	b := batch["brilliant"]
	c := batch["creative"]

	fmt.Println(a)
	fmt.Println(b)
	fmt.Println(c)
}

```

![Output program menampilkan nilai dari map batch](/files/-MSSt8RXIpHmYDmHehEZ)

#### Delete elemen pada map

Kita juga dapat menghapus elemen pada `map` menggunakan function built-in `delete` .

```
delete(m, key)
```

```go
package main

import (
	"fmt"
)

func main() {
	batch := map[string]int{"adorable": 20, "brilliant": 10, "creative": 15}

	delete(batch, "adorable")
	fmt.Println(batch["adorable"])
	fmt.Println(batch)
}
```

Dari kode di atas kita lihat bahwa kita menghapus elemen `map` pada `key` `adorable` sehingga jika kita akses `key` dari `adorable` dan isi dari map `batch` maka akan menghasilkan output seperti berikut ini:

![Output program dari penggunaan fungsi delete pada map](/files/-MSSv2c5Cv1QIc6cqkH2)

### Deteksi Keberadaan Item Dengan Key Tertentu <a href="#a175-deteksi-keberadaan-item-dengan-key-tertentu" id="a175-deteksi-keberadaan-item-dengan-key-tertentu"></a>

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

```
elem, ok = m[key]
```

```go
package main

import (
	"fmt"
)

func main() {
	batch := map[string]int{"adorable": 20, "brilliant": 10, "creative": 15}

	value, isExist := batch["dilligent"]

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

![Tidak ditemukam value dari key dilligent](/files/-MSSwV8gwFJm9xNd4SXl)

### Slice of Map

Kita dapat menggunakan slice of map atau kombinasi antara slice dan map.

```go
package main

import (
	"fmt"
)

func main() {
	batch := []map[string]string{
		{"name": "adroable", "year": "2020"},
		{"name": "brilliant", "year": "2021"},
		{"name": "creative", "year": "2019"},
	}

	fmt.Println(batch)
}
```

Dari kode di atas dapat disimpulkan yaitu slice yang tipe tiap elemen-nya adalah `map[string]string` .

![Menampilkan isi slice bertipe map](/files/-MSSz4HUX_uiE3olp731)

Bagaimana jika kita ingin menghasilkan seluruh elemen slice yang bertipe map? kita daoat menggunakan looping `for` - `range` :

```go
package main

import (
	"fmt"
)

func main() {
	batch := []map[string]string{
		{"name": "adroable", "year": "2020"},
		{"name": "brilliant", "year": "2021"},
		{"name": "creative", "year": "2019"},
	}

	for _, value := range batch {
		fmt.Println(value["name"])
	}
}
```

![Hasil perulangan dari slice of map pada variabel batch](/files/-MSSzdHN9iT37NzAxUlL)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://davidwinalda94.gitbook.io/mastering-golang/map.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
