← Danh sách bài học Bài 9/20

🗺️ Bài 9: Map (Dictionary)

⏱️ 20 phút | 📚 Trung bình

🎯 Mục tiêu:

1. Map Là Gì?

Map lưu trữ dữ liệu theo cặp key-value (khóa-giá trị). Giống dictionary trong Python hoặc object trong JavaScript.

// Cú pháp: map[KeyType]ValueType

// Tạo map với make
ages := make(map[string]int)
ages["Minh"] = 25
ages["Lan"] = 22

// Tạo map với literal
colors := map[string]string{
    "red":   "#FF0000",
    "green": "#00FF00",
    "blue":  "#0000FF",
}
fmt.Println(colors["red"])  // #FF0000

2. Thêm, Đọc, Sửa Phần Tử

scores := make(map[string]int)

// Thêm
scores["Math"] = 90
scores["English"] = 85

// Đọc
fmt.Println(scores["Math"])  // 90

// Sửa
scores["Math"] = 95
fmt.Println(scores["Math"])  // 95

3. Kiểm Tra Key Tồn Tại

scores := map[string]int{"Math": 90}

// Đọc key không tồn tại → zero value
fmt.Println(scores["Physics"])  // 0

// Kiểm tra key có tồn tại không
value, exists := scores["Math"]
if exists {
    fmt.Println("Math score:", value)
}

// Cách viết gọn
if score, ok := scores["English"]; ok {
    fmt.Println("English:", score)
} else {
    fmt.Println("English không tồn tại")
}
💡 ok idiom: value, ok := map[key] - ok là true nếu key tồn tại

4. Xóa Phần Tử

scores := map[string]int{
    "Math": 90,
    "English": 85,
}

delete(scores, "English")  // Xóa key "English"
fmt.Println(scores)         // map[Math:90]

// Xóa key không tồn tại → không lỗi
delete(scores, "Physics")

5. Duyệt Map với range

fruits := map[string]int{
    "Apple":  5,
    "Orange": 3,
    "Banana": 7,
}

for key, value := range fruits {
    fmt.Printf("%s: %d\n", key, value)
}

// Chỉ lấy keys
for key := range fruits {
    fmt.Println(key)
}
⚠️ Lưu ý: Thứ tự duyệt map KHÔNG cố định! Mỗi lần chạy có thể khác nhau.

6. Map Lồng Nhau

// Map của map
students := map[string]map[string]int{
    "Minh": {"Math": 90, "English": 85},
    "Lan":  {"Math": 95, "English": 88},
}

fmt.Println(students["Minh"]["Math"])  // 90

📝 Tóm Tắt