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 iniSaat 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"] = 42Untuk 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 amanPemeriksaan sederhana ini memastikan programmu tidak akan crash saat bekerja dengan map yang mungkin belum diinisialisasi, sehingga kodemu lebih tangguh dan andal.
Tantangan
MudahBuat 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]"
"check:scores,init:scores,add:scores:Alice:95,add:scores:Bob:87,check:grades"
Tugasmu adalah:
- Buat dua variabel map bertipe
map[string]intbernamascoresdangradestanpa menginisialisasinya (keduanya akan bernilai nil) - Proses setiap operasi dari string input secara berurutan:
- 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
- Untuk operasi
"init":- Inisialisasi map yang ditentukan menggunakan
make(map[string]int) - Cetak
"Initialized map [map_name]"
- Inisialisasi map yang ditentukan menggunakan
- 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]"
- 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
- 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
scoresterlebih dahulu, lalugrades, apa pun urutan penggunaannya dalam operasi
- Untuk setiap map, jika nil:
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
}Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Logika & Alur
1Alur Kontrol Lanjutan
switch dengan `fallthrough`Keluar dari Perulangan BersarangMelanjutkan Perulangan TertentuPernyataan `goto`Rangkuman, Kontrol Perulangan Lanjutan4Proyek: Daftar Tugas Sederhana
Menyiapkan ProyekMenambahkan Tugas2Struct dan Method
Mendefinisikan Method pada StructPenerima NilaiPenerima PointerMemilih PenerimaMethod vs FungsiRekap: Perilaku Struct5Map secara Mendalam
Map Berisi StructPointer sebagai Nilai MapMenguji Map NilMembandingkan MapRingkasan: Penghitung Frekuensi Kata8Proyek: Inventaris Sederhana
Gambaran Umum ProyekMemeriksa Stok3Interface (Dasar)
Apa Itu Interface?Mendefinisikan InterfaceMengimplementasikan InterfaceMenggunakan Tipe InterfaceInterface KosongType AssertionType SwitchRingkasan: Bentuk dan PerilakuLatihan sendiri: Compiler Go online