Để mở rộng một chút về câu trả lời đã được đưa ra:
Một Go bản đồ là một đánh máy băm cấu trúc dữ liệu bản đồ. Chữ ký loại của bản đồ có dạng map[keyType]valueType
trong đó keyType
và valueType
là các loại khóa và giá trị tương ứng.
Để khởi tạo một bản đồ, bạn phải sử dụng chức năng make
:
m := make(map[string]int)
Một bản đồ chưa được khởi tạo bằng nil
, và nếu đọc từ hay viết một hoảng loạn sẽ xảy ra khi chạy.
Cú pháp để lưu trữ các giá trị cũng tương tự như làm như vậy với mảng hoặc lát:
m["Alice"] = 21
m["Bob"] = 17
Tương tự như vậy, lấy giá trị từ một bản đồ được thực hiện như sau:
a := m["Alice"]
b := m["Bob"]
Bạn có thể sử dụng từ khóa range
để lặp qua bản đồ với vòng lặp for
:
for k, v := range m {
fmt.Println(k, v)
}
Mã này sẽ in:
Alice 21
Bob 17
Lấy một giá trị cho một chìa khóa mà không có trong bản đồ sẽ trở lại giá trị kiểu giá trị của số không:
c := m["Charlie"]
// c == 0
Bằng cách đọc nhiều giá trị từ một bản đồ, bạn có thể kiểm tra sự hiện diện của một chìa khóa.Giá trị thứ hai sẽ là một boolean chỉ ra sự hiện diện của chính:
a, ok := m["Alice"]
// a == 21, ok == true
c, ok := m["Charlie"]
// c == 0, ok == false
Để loại bỏ một mục quan trọng/giá trị từ một bản đồ, bạn lật nó xung quanh và gán false
như giá trị thứ hai:
m["Bob"] = 0, false
b, ok := m["Bob"]
// b == 0, ok == false
Bạn có thể lưu trữ các loại tùy ý trong bản đồ bằng cách sử dụng các loại giao diện trống interface{}
:
n := make(map[string]interface{})
n["One"] = 1
n["Two"] = "Two"
các điều kiện duy nhất là khi lấy những giá trị bạn phải thực hiện một loại khẳng định để sử dụng chúng ở dạng ban đầu của họ:
a := n["One"].(int)
b := n["Two"].(string)
Bạn có thể sử dụng một công tắc loại để xác định loại các giá trị bạn đang kéo ra, và đối phó với chúng một cách thích hợp:
for k, v := range n {
switch u := v.(type) {
case int:
fmt.Printf("Key %q is an int with the value %v.\n", k, u)
case string:
fmt.Printf("Key %q is a string with the value %q.\n", k, u)
}
}
Bên trong mỗi khối case
, u
sẽ thuộc loại được chỉ định trong tuyên bố case
; không có xác nhận loại rõ ràng là cần thiết.
Mã này sẽ in:
Key "One" is an int with the value 1.
Key "Two" is a string with the value "Two".
Chìa khóa có thể là bất kỳ loại mà các nhà điều hành bình đẳng được xác định, chẳng hạn như số nguyên, phao, dây, và con trỏ. Các loại giao diện cũng có thể được sử dụng, miễn là loại cơ bản hỗ trợ sự bình đẳng. (Struct, mảng và lát không thể được sử dụng như phím bản đồ, vì bình đẳng không được định nghĩa trên các loại.)
Ví dụ, bản đồ o
có thể lấy chìa khóa của bất kỳ của các loại trên:
o := make(map[interface{}]int)
o[1] = 1
o["Two"] = 2
Và đó là bản đồ trong một nutshell.
Không cần điều kiện, nó thành ngữ hơn chỉ để thực hiện 'm [key] ++'. Nếu khóa không tồn tại, bạn nhận được giá trị bằng không. –