Chuyển đến nội dung chính
Mô-đun 4 · Bài học 3 trong tổng số 518/50 trong khóa học~12 min
Bài học theo mô-đun (3/5)

Bản đồ: khóa và giá trị

bản đồ là bảng băm khóa→giá trị: map[K]V. Bản đồ là tài liệu tham khảo loại: được truyền cho một hàm, chúng chia sẻ cùng một bộ lưu trữ. Họ phải là được khởi tạo trước khi bạn có thể viết thư cho chúng (với make hoặc bằng chữ).

Sáng tạo

Go
// with a literal
prices := map[string]int{"pane": 2, "latte": 3}

// with make
counters := make(map[string]int)
counters["a"] = 1

// nil map (readable, NOT writable)
var m map[string]int
fmt.Println(m["x"])    // 0 — ok
// m["y"] = 1          // PANIC

Các thao tác cơ bản

Go
m := map[string]int{"a": 1}

m["b"] = 2              // insert/update
v := m["a"]             // get; if missing: zero value
delete(m, "a")          // remove (ok even if the key doesn't exist)
n := len(m)             // number of entries

Dấu phẩy-ok: phân biệt "thiếu" với "giá trị 0"

Go
v, ok := m["x"]
if !ok {
    fmt.Println("key missing")
} else {
    fmt.Println("found:", v)
}

Đó là cách duy nhất để biết liệu khóa có tồn tại hay không vì m["x"] trả về giá trị 0 ngay cả khi khóa không có ở đó. Một mô hình cơ bản.

Lặp lại: thứ tự ngẫu nhiên

Go
for k, v := range m {
    fmt.Println(k, v)
}

Phím: chỉ các loại có thể so sánh được

Khóa phải có thể so sánh được: string, số, bool, con trỏ, kênh, giao diện, mảng có kiểu so sánh được, cấu trúc có thể so sánh được lĩnh vực. Lát cắt, bản đồ và chức năng không thể so sánh được → chúng không thể là chìa khóa.

Go
m := map[[2]int]string{}   // ok: array is comparable
// m := map[[]int]string{} // ERROR: slice is not comparable

Mẫu: quầy

Một trong những cách sử dụng bản đồ phổ biến nhất:

Go
words := []string{"a", "b", "a", "c", "b", "a"}
freq := map[string]int{}
for _, w := range words {
    freq[w]++   // access to a missing key is 0 → 0+1 = 1
}
// freq = {"a": 3, "b": 2, "c": 1}

Hãy thử nó

tập thể dục#go.m4.l3.e1
Nỗ lực: 0Đang tải…

Tạo một bản đồ[string]int với các giá trị 'a' -> 1 và 'b' -> 2, sau đó thêm 'c' -> 3.

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

Nghĩa đen: `map[K]V{"key": value, ...}`.

Giải pháp khả dụng sau 3 lần thử

tập thể dục#go.m4.l3.e2
Nỗ lực: 0Đang tải…

Sử dụng mẫu dấu phẩy-ok để đọc khóa 'x' (không có) thành v, ok và in cả hai.

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

Hai giá trị trả về: giá trị và một boolean hiện diện.

Giải pháp khả dụng sau 3 lần thử

Quiz#go.m4.l3.e3
Sẵn sàng

Điều gì xảy ra khi ghi vào bản đồ nil?

Go
var m map[string]int
m["a"] = 1
Tùy chọn trả lời

Tóm tắt lại

  • map[K]V: khóa-giá trị, tham chiếu, được hỗ trợ băm.
  • Khởi tạo bằng make hoặc bằng chữ; bản đồ không → hoảng sợ khi viết.
  • v, ok := m[k] là cách duy nhất để phân biệt "thiếu" với "giá trị 0".
  • delete(m, k) xóa; được ngay cả khi k không tồn tại.
  • range lặp lại: ngẫu nhiên thứ tự.
  • Phím: chỉ có các loại có thể so sánh được (không có slice/map/func).
  • Mẫu bộ đếm: freq[k]++ tận dụng giá trị 0 ẩn.