Menu
CoddyTech

Menguji Map Nil

Termasuk bagian Logika & Alur dalam perjalanan GO di Coddy. Pelajaran 28 dari 68.

Di Go, map dapat memiliki status khusus yang disebut nil. Map nil pada dasarnya adalah map yang belum diinisialisasi dan tidak menunjuk ke apa pun di memori. Memahami konsep ini sangat penting karena mencoba menambahkan kunci ke map nil akan menyebabkan programmu mengalami panic dan crash.

Berikut cara sebuah map nil terjadi dan seperti apa bentuknya:

var myMap map[string]int
// myMap bernilai nil pada titik ini

Saat kamu mendeklarasikan variabel map tanpa menginisialisasinya, Go secara otomatis menetapkannya ke nil. Kamu dapat membaca map nil dengan aman, karena map tersebut akan mengembalikan nilai nol, tetapi mencoba menulis ke dalamnya akan menyebabkan panic:

// Ini aman, mengembalikan 0
value := myMap["key"]

// Ini akan menyebabkan panic!
myMap["key"] = 42

Untuk menghindari masalah ini, kamu harus selalu memeriksa apakah map bernilai nil sebelum mencoba menambahkan kunci ke dalamnya. Pemeriksaannya sederhana:

if myMap == nil {
    myMap = make(map[string]int)
}
myMap["key"] = 42 // Sekarang ini aman

Pemeriksaan sederhana ini memastikan programmu tidak akan crash saat bekerja dengan map yang mungkin belum diinisialisasi, sehingga kodemu lebih tangguh dan andal.

challenge icon

Tantangan

Mudah

Buat sistem inisialisasi map yang aman untuk mencegah error panic dengan memeriksa apakah map bernilai nil sebelum mencoba melakukan operasi penulisan. Tantangan ini menunjukkan pentingnya memvalidasi status map sebelum melakukan operasi yang dapat membuat programmu crash.

Kamu akan menerima dua input:

  • String yang menunjukkan jumlah operasi (misalnya, "5")
  • String berisi operasi yang dipisahkan dengan koma. Setiap operasi menyebutkan map yang digunakan:
    • "check:[map_name]"
    • "init:[map_name]"
    • "add:[map_name]:[key]:[value]"
    Contohnya, "check:scores,init:scores,add:scores:Alice:95,add:scores:Bob:87,check:grades"

Tugasmu adalah:

  1. Buat dua variabel map bertipe map[string]int bernama scores dan grades tanpa menginisialisasinya (keduanya akan bernilai nil)
  2. Proses setiap operasi dari string input secara berurutan:
  3. Untuk operasi "check":
    • Periksa apakah map yang ditentukan bernilai nil
    • Cetak "Map [map_name] is nil" jika map bernilai nil
    • Cetak "Map [map_name] is initialized" jika map tidak bernilai nil
  4. Untuk operasi "init":
    • Inisialisasi map yang ditentukan menggunakan make(map[string]int)
    • Cetak "Initialized map [map_name]"
  5. Untuk operasi "add":
    • Periksa terlebih dahulu apakah map bernilai nil
    • Jika map bernilai nil, cetak "Cannot add to nil map [map_name]"
    • Jika map tidak bernilai nil, tambahkan pasangan key-value lalu cetak "Added [key]:[value] to [map_name]"
  6. Parse operasi dengan memisahkan string input:
    • Pisahkan berdasarkan koma untuk mendapatkan setiap operasi
    • Untuk setiap operasi, pisahkan berdasarkan titik dua untuk mendapatkan tipe operasi dan parameternya
    • Ubah string nilai menjadi integer untuk operasi add
  7. Setelah memproses semua operasi, tampilkan status akhir kedua map:
    • Untuk setiap map, jika nil: "Final state - [map_name]: nil"
    • Untuk setiap map, jika sudah diinisialisasi: "Final state - [map_name]: [count] entries", dengan count sebagai jumlah pasangan key-value
    • Cetak scores terlebih dahulu, lalu grades, apa pun urutan penggunaannya dalam operasi

Gunakan package strconv untuk mengubah string nilai menjadi integer dalam operasi add. Tantangan ini menunjukkan bahwa memeriksa map bernilai nil sebelum operasi penulisan dapat mencegah panic saat program berjalan dan membuat kodemu tangguh serta andal.

Coba sendiri

package main

import (
	"fmt"
	"strconv"
	"strings"
)

func main() {
	// Baca input
	var numOpsStr string
	var operationsStr string
	fmt.Scanln(&numOpsStr)
	fmt.Scanln(&operationsStr)
	
	// Deklarasikan map tanpa inisialisasi (nilainya akan nil)
	var scores map[string]int
	var grades map[string]int
	
	// Pisahkan operations berdasarkan koma
	operations := strings.Split(operationsStr, ",")
	
	// TODO: Tulis kodemu di bawah ini
	// Proses setiap operasi secara berurutan
	// Tangani operasi "check", "init", dan "add"
	// Untuk operasi add, gunakan strconv.Atoi() untuk mengubah nilai string menjadi bilangan bulat
	
	// Tampilkan keadaan akhir kedua map
	// Periksa apakah map bernilai nil atau sudah diinisialisasi, lalu tampilkan hasilnya sesuai kondisi
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Logika & Alur

Latihan sendiri: Compiler Go online