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
// 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 // PANICCác thao tác cơ bản
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 entriesDấu phẩy-ok: phân biệt "thiếu" với "giá trị 0"
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
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.
m := map[[2]int]string{} // ok: array is comparable
// m := map[[]int]string{} // ERROR: slice is not comparableMẫu: quầy
Một trong những cách sử dụng bản đồ phổ biến nhất:
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ạo một bản đồ[string]int với các giá trị 'a' -> 1 và 'b' -> 2, sau đó thêm 'c' -> 3.
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ử
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.
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ử
Điều gì xảy ra khi ghi vào bản đồ nil?
var m map[string]int
m["a"] = 1Tó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
makehoặ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ả khikkhông tồn tại.rangelặ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.