
Go From Zero to Hero #17: Panduan Lengkap Menggunakan Map dan Manipulasi Key-Value di Golang
- Daffa Fadhil
- Golang, Code
- 10 Juli 2026
Table of Contents
Halo Go Developers! Selamat datang kembali di seri Go From Zero to Hero.
Di artikel sebelumnya, kita sudah menguasai Slice, si wadah dinamis yang bisa melar sesuka hati. Namun, Slice punya satu keterbatasan: kita hanya bisa mengambil data menggunakan angka urutan indeks (0, 1, 2, ...).
Bayangkan jika kamu punya data profil user dan ingin mengambil data “umur”. Kalau pakai Slice, kamu terpaksa harus mengingat umur itu ada di indeks nomor berapa, atau repot-repot melakukan looping dari awal sampai ketemu. Ribet, kan?
Nah, di sinilah Map hadir sebagai pahlawan! Sederhananya, Map adalah struktur data bawaan Go untuk menyimpan kumpulan data berbentuk Key-Value (Kunci dan Nilai). Jika kamu familier dengan bahasa lain, Map ini mirip seperti Dictionary di Python, Assoziative Array di PHP, atau Object/Literal di JavaScript (bergaya JSON).
Yuk, kita bedah cara membuat, menambah, mengambil, hingga menghapus data menggunakan Map di Go!
Apa Itu Map dan Kenapa Sangat Penting?
Jika kamu sedang kuliah di jurusan Teknik Informatika atau Sistem Informasi, kamu mungkin tidak akan menemukan bab berjudul “Map” di buku diktat mata kuliahmu. Jangan bingung dulu! Di ranah akademis, konsep ini punya nama ilmiah yang keren: Hash Table atau Associative Array.
Apapun namanya, esensinya tetap sama. Jika Array atau Slice menyimpan data menggunakan nomor urut indeks (0, 1, 2, ...), maka Map menyimpan data dengan memasangkan dua hal: Key (Kunci) dan Value (Nilai).
Hebatnya, Key di dalam Map tidak harus berupa angka urut. Kamu bebas menentukan kuncinya sendiri menggunakan tipe data lain seperti string.
Alasan Utama Kenapa Map Sangat Powerfull: Efisiensi Waktu Pencarian (O(1))
Bayangkan kamu memiliki data 10.000 user aktif di dalam databasemu. Kamu ingin mencari tahu berapa umur user yang bernama "budi".
- Jika Menggunakan Slice (Linear Search): Komputer terpaksa harus mengecek elemen satu per satu dari indeks ke-0, ke-1, ke-2, terus ke bawah sampai ketemu nama
"budi". Kalau si budi ternyata ada di urutan terakhir (indeks ke-9.999), performa aplikasimu otomatis akan melambat karena waktu pencariannya berbanding lurus dengan jumlah data (O(n)). - Jika Menggunakan Map (Hash Map Lookup): Komputer memanfaatkan teknologi Hashing. Begitu kamu memanggil
userAge["budi"], komputer langsung melompat tepat ke alamat memori tempat data budi disimpan secara instan.
Mau datamu berjumlah 10 biji atau berkembang biak sampai 10 juta biji, waktu yang dibutuhkan Map untuk menemukan data tersebut akan selalu sama cepatnya dan konstan (O(1)).
Di industri nyata, efisiensi inilah yang membuat Map menjadi pilihan wajib dan mutlak bagi para Backend Engineer untuk mengelola data berkapasitas besar, melakukan caching, hingga memproses data transfer antar-server yang berformat JSON.
Cara Membuat Map di Go
Sama seperti Slice, Go menyediakan beberapa cara untuk membuat Map. Aturan mainnya: Tipe data untuk Key dan tipe data untuk Value harus didefinisikan sejak awal.
1. Menggunakan Map Literal (Cara Langsung)
Cara ini paling pas kalau kamu sudah punya data awal yang ingin langsung dimasukkan.
package main
import "fmt"
func main() {
// Format: map[tipe_data_key]tipe_data_value
userAge := map[string]int{
"Budi": 25,
"Andi": 30,
"Siti": 22,
}
fmt.Println(userAge) // Output: map[Andi:30 Budi:25 Siti:22]
}
Manipulasi Data Map: Menambah, Mengubah, dan Menghapus
Melakukan operasi data pada Map di Go itu sangat menyenangkan karena sintaksisnya ringkas dan straight-to-the-point. Kamu tidak perlu memanggil fungsi khusus yang rumit seperti append() pada Slice.
Cukup gunakan tanda kurung siku [] untuk menunjuk Key-nya, lalu eksekusi data di dalamnya.
1. Menambah dan Mengubah Data
Menariknya, Go menggunakan sintaksis yang sama persis baik untuk menambah data baru maupun mengubah data yang sudah ada.
- Menambah Data: Jika Key yang kamu masukkan belum ada, Go otomatis membuatkan slot baru di dalam Map.
- Mengubah Data: Jika Key yang kamu masukkan sudah ada, Go akan langsung menimpa (overwrite) nilai lamanya dengan nilai yang baru.
Yuk, kita lihat contoh penerapannya pada kode berikut:
package main
import "fmt"
func main() {
// Kita buat Map kosong untuk menampung data ibu kota negara
ibuKota := make(map[string]string)
// --- MENAMBAH DATA BARU ---
ibuKota["Indonesia"] = "Jakarta"
ibuKota["Jepang"] = "Tokyo"
ibuKota["Inggris"] = "London"
fmt.Println("Setelah ditambah:", ibuKota)
// Output: map[Indonesia:Jakarta Inggris:London Jepang:Tokyo]
// --- MENGUBAH DATA YANG SUDAH ADA ---
// Kita ubah Ibu Kota Indonesia menjadi Nusantara
ibuKota["Indonesia"] = "Nusantara"
fmt.Println("Setelah diubah:", ibuKota)
// Output: map[Indonesia:Nusantara Inggris:London Jepang:Tokyo]
}
Menghapus Data dengan delete()
Bagaimana jika ada data yang sudah tidak digunakan lagi dan ingin kita buang dari memori RAM? Go menyediakan fungsi bawaan (built-in function) bawaan bernama delete().
Fungsi ini membutuhkan dua argumen wajib di dalam kurungnya:
delete(nama_map, "nama_key_yang_mau_dihapus")
Mari kita coba hapus data negara “Inggris” dari Map kita sebelumnya:
package main
import "fmt"
func main() {
ibuKota := map[string]string{
"Indonesia": "Nusantara",
"Jepang": "Tokyo",
"Inggris": "London",
}
// Menghapus data Inggris menggunakan key-nya
delete(ibuKota, "Inggris")
fmt.Println("Setelah dihapus:", ibuKota)
// Output: map[Indonesia:Nusantara Jepang:Tokyo]
// Tips: Jika kamu menghapus key yang dari awal memang tidak ada,
// Go tidak akan error atau panik. Program akan tetap berjalan aman!
delete(ibuKota, "Amerika")
}
Trik Penting: Memeriksa Keberadaan Key (Comma Okay Idiom)
Di bahasa pemrograman lain, kalau kamu mencoba mengambil data dari kunci (key) yang tidak eksis, program biasanya akan langsung crash atau melempar error. Tapi di Go-lang, perilakunya sangat unik. Go tidak akan error.
Jika key tidak ditemukan, Go secara otomatis akan mengembalikan nilai default kosong (Zero Value) dari tipe data nilainya. Contohnya:
- Jika tipe data nilainya
string, dikembalikan teks kosong"". - Jika tipe data nilainya
int, dikembalikan angka0.
Perilaku ini bisa menjadi jebakan Batman. Misal, kamu mencari nilai ujian Budi dan keluar angka 0. Apakah Budi memang dapat nilai nol, atau sebenarnya data Budi belum diinput ke dalam Map?
Untuk mengatasi masalah ini, Go menyediakan sebuah trik keren yang dinamakan “Comma Okay Idiom”. Sintaksisnya memanfaatkan pengembalian variabel kedua berjenis boolean (true/false):
package main
import "fmt"
func main() {
skor := map[string]int{
"Andi": 85,
"Siti": 90,
}
// Trik Comma Okay Idiom: variabel 'ada' akan bernilai true atau false
nilai, ada := skor["Budi"]
if ada {
fmt.Println("Data ditemukan! Skor Budi adalah:", nilai)
} else {
fmt.Println("Peringatan: Data Budi tidak ditemukan di dalam sistem!")
}
}
Dengan trik di atas, kamu bisa memastikan validitas data di dalam Map secara akurat sebelum memprosesnya lebih jauh.
Studi Kasus: Membuat Program Input Data Interaktif
Buat sebuah file baru bernama main.go, lalu ketik kode interaktif di bawah ini: Agar semua materi Map yang sudah kita bahas dari tadi makin menempel di kepala, mari kita satukan semuanya ke dalam sebuah mini-project. Kita akan membuat program interaktif berbasis terminal.
Skenarionya: Program akan meminta user (dosen) memasukkan nama dan nilai mahasiswa berulang kali sampai user mengetik kata “selesai”. Setelah itu, program akan memproses Map tersebut untuk menghitung total mahasiswa, status kelulusan, dan nilai rata-ratanya.
Kode Program Lengkap (main.go)
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
// 1. Membuat map kosong untuk menampung data Nama (Key) dan Nilai (Value)
dataNilai := make(map[string]int)
// 2. Menggunakan bufio.Scanner untuk membaca input keyboard (bisa membaca spasi)
scanner := bufio.NewScanner(os.Stdin)
fmt.Println("==================================================")
fmt.Println(" PROGRAM INTERAKTIF: INPUT NILAI MAHASISWA ")
fmt.Println("==================================================")
fmt.Println("Ketik 'selesai' pada nama mahasiswa untuk melihat hasil.")
fmt.Println("--------------------------------------------------")
// Perulangan terus-menerus (infinite loop) untuk menangkap input
for {
fmt.Print("Masukkan Nama Mahasiswa : ")
scanner.Scan()
nama := strings.TrimSpace(scanner.Text()) // Bersihkan spasi di awal/akhir
// Cek kondisi berhenti
if strings.ToLower(nama) == "selesai" {
break
}
if nama == "" {
fmt.Println("⚠️ Nama tidak boleh kosong, silakan coba lagi.\n")
continue
}
fmt.Print("Masukkan Nilai (0-100) : ")
scanner.Scan()
inputNilai := strings.TrimSpace(scanner.Text())
// Konversi string input menjadi integer asli
nilai, err := strconv.Atoi(inputNilai)
if err != nil || nilai < 0 || nilai > 100 {
fmt.Println("⚠️ Nilai wajib angka antara 0 - 100! Data gagal disimpan.\n")
continue
}
// SIMPAN DATA KE MAP
dataNilai[nama] = nilai
fmt.Println("✅ Data berhasil disimpan!\n")
}
// 3. PROSES OLAH DATA & MENAMPILKAN OUTPUT
fmt.Println("\n==================================================")
fmt.Println(" HASIL OLAH DATA ")
fmt.Println("==================================================")
if len(dataNilai) == 0 {
fmt.Println("Tidak ada data mahasiswa yang dimasukkan.")
return
}
totalNilai := 0
// Melakukan looping pada Map menggunakan keyword 'range'
for nama, nilai := range dataNilai {
status := "LULUS"
if nilai < 70 {
status = "REMIDI"
}
fmt.Printf("- %s \t: %d (%s)\n", nama, nilai, status)
totalNilai += nilai
}
// Hitung rata-rata dengan konversi tipe data ke float64
rataRata := float64(totalNilai) / float64(len(dataNilai))
fmt.Println("--------------------------------------------------")
fmt.Printf("Total Mahasiswa : %d orang\n", len(dataNilai))
fmt.Printf("Rata-rata Nilai : %.2f\n", rataRata)
fmt.Println("==================================================")
}
Jalankan dan Lihat Hasilnya! Silakan buka terminal kamu, lalu jalankan perintah go run main.go. Jalannya program interaktif tersebut akan terlihat seperti simulasi di bawah ini:
==================================================
PROGRAM INTERAKTIF: INPUT NILAI MAHASISWA
==================================================
Ketik 'selesai' pada nama mahasiswa untuk melihat hasil.
--------------------------------------------------
Masukkan Nama Mahasiswa : Budi Santoso
Masukkan Nilai (0-100) : 85
✅ Data berhasil disimpan!
Masukkan Nama Mahasiswa : Siti Aminah
Masukkan Nilai (0-100) : 65
✅ Data berhasil disimpan!
Masukkan Nama Mahasiswa : selesai
==================================================
HASIL OLAH DATA
==================================================
- Budi Santoso : 85 (LULUS)
- Siti Aminah : 65 (REMIDI)
--------------------------------------------------
Total Mahasiswa : 2 orang
Rata-rata Nilai : 75.00
==================================================
Kesimpulan
Selamat! Kamu baru saja menguasai salah satu struktur data paling vital di dalam dunia pemrograman, khususnya di ekosistem Go-lang.
Mari kita rangkum poin penting yang wajib kamu ingat tentang Map:
- Key-Value Pair: Map menyimpan data berdasarkan pasangan Kunci (Key) dan Nilai (Value), di mana tipe datanya harus didefinisikan secara statis sejak awal.
- Kecepatan Konstan (O(1)): Berkat teknologi Hash Table, mencari data di dalam Map terjadi secara instan tanpa perlu melakukan perulangan memutar (looping) dari atas ke bawah.
- Unordered: Urutan data di dalam Map tidak dijamin. Go secara sengaja mengacak urutan elemen demi mengoptimalkan kecepatan performa internalnya.
- Comma Okay Idiom: Selalu gunakan trik pengembalian boolean (
value, ada := namaMap[key]) saat ingin memastikan apakah suatu key benar-benar eksis atau tidak.
Menguasai kombinasi antara Slice (untuk list data berurutan) dan Map (untuk pencarian key-value cepat) akan memberikanmu pondasi yang sangat kuat dalam memanipulasi data saat membangun aplikasi web API atau backend asli nantinya.
Next Teaser: Mengelompokkan Data Kompleks dengan Struct!
Sekarang kita sudah bisa menyimpan data berbentuk key-value. Namun, kamu mungkin menyadari satu keterbatasan Map: tipe data untuk semua kuncinya harus seragam, begitu pula dengan nilainya.
Lalu, bagaimana jika kita ingin memodelkan objek dunia nyata yang lebih kompleks? Misalnya, kita ingin membuat entitas User yang di dalamnya wajib memiliki ID berjenis integer, Nama berjenis string, Email berjenis string, dan status Aktif berjenis boolean sekaligus. Map tentu tidak bisa melakukan hal ini.
Di artikel berikutnya, Go From Zero to Hero #11, kita akan membedah fitur paling powerful dan fundamental di Go untuk menyatukan berbagai tipe data berbeda ke dalam satu cetakan objek kustom, yaitu Struct. Fitur ini juga menjadi jembatan utama kita sebelum masuk ke konsep Object-Oriented Programming (OOP) ala Go-lang.
Sampai jumpa di artikel berikutnya, tetap semangat, dan happy coding!