I. Khái niệm về Map
Map là một built-in Type trong golang. Map associate một value tới một key. Value có thể được retrieved bằng cách sử dụng key tương ứng.
II. How to create a Map
Map có thể được tạo bằng 2 cách:
1. Tạo Map với make function
Syntax
map := make(map[key-type]value-type)
Ví dụ:
personSalary := make(map[string]int)
với cú pháp trên, ta vừa tạo một map personSalary với key là string và value dạng int
Zero value của Map là nil. Nếu chúng ta add một item vào một nil map, sẽ gây panic. Vì vậy, ta phải khởi tạo initialized map với make trước khi sử dụng.
2. Short hand declaration
Ta có thể tạo một map bằng cách gọi trực tiếp
map := map[string]int{ "key": 1 }
III. Adding items vaò map
Có thể add items vào map dựa vào cấu trúc sau:
map[key] = value
Ví dụ:
package main
import (
"fmt"
)
func main() {
personSalary := make(map[string]int)
personSalary[" person1"] = 12000
personSalary["person2"] = 15000 personSalary["person3"] = 9000 fmt.Println("personSalary map contents:", personSalary)
}st
Run chương trình trên, output sẽ như sau:
personSalary map contents: map[person1:12000 person2:15000 person3:9000]
Những type nào có thể sử dụng làm key của một map?
Tất cả những comparable type như: bolean, integer, float, string, comflex ... đều có thể sử dụng làm key của một map.
Key của một map là không thể trùng nhau.
IV. Accessing items của map
Value của map được retrieved using key tương ứng
value := map[key]
Chuyện gì sẽ xảy nếu một key được retrieved không tồn tại?
Khi đó, value được trả về sẽ là zero value của key đó. Ví dụ "" với key là string, 0 với key là int ...
package main
import (
"fmt"
)
func main() {
personSalary := map[string]int{
"person1": 12000,
"person2": 15000, }
personSalary["person3"] = 9000 employee := "person1" fmt.Println("Salary of", employee, "is", personSalary[employee])
fmt.Println("Salary of person4 is", personSalary["person4"])}
khi đó, output sẽ trả về:
Salary of person1 is 15000 Salary of person4
is 0
Làm thế nào chúng ta biết được một key có nằm trong map đó hay không?
Check với syntax sau:
value, ok := map[key]
- Nếu key nằm trong map, ok sẽ trả về true
- Nêú key không nằm trong map, ok sẽ trả về false
Để iterate all items in map, sử dụng range form của for loop
package main
import (
"fmt"
)
func main() {
personSalary := map[string]int{
"person1": 12000, "person2": 15000, }
personSalary["person3"] = 9000 fmt.Println("All items of a map")
for key, value := range personSalary {
fmt.Printf("personSalary[%s] = %d\n", key, value)
}
}
Output của chương trình trên:
All items of a map
personSalary[person1] = 9000
personSalary[person2] = 12000
personSalary[person3
] = 15000
V. Deleting Item trong một map
Sử dụng delete func với syntax sau:
delete(map, key)
VI. Length của một map
length của map có thể được xác đinh bởi len() func
len(map)
VII. Map là một reference Type
Giống như slice, Map là một reference type. Nghĩa là, khi map được assign tới một value, cả hai đối tượng sẽ được point tới cùng một internal data structure. Vì vậy, khi ta thay đổi biến hoặc map, đối tượng còn lại sẽ thay đổi theo
package main
import (
"fmt"
)
func main() {
personSalary := map[string]int{
"person1": 12000,
"person2": 15000, }
personSalary["person3"] = 9000 fmt.Println("Original person salary", personSalary)
newPersonSalary := personSalary
newPersonSalary["person3"] = 18000 fmt.Println("Person salary changed", personSalary)
}
Trong chương trình trên, personSalary sẽ được assign tới newPersonSalary. vì vậy, khi ta thay đổi newPersonSalary, personSalary cũng sẽ thay đổi theo.
Output của chương trình sẽ là:
Original person salary map[person1:12000 person2:15000 person3:9000]
Person salary changed map[person1
:12000 person2:15000 person3:18000]
VIII. Làm thế nào để compare hai map với nhau?
Hai map không thể compare sử dụng dấu ==. == chỉ được sử dụng để check khi map là nil.
Để check hai map bằng nhau, chúng ta chỉ có thể check lần lượt từng phần tử trong mỗi map là bằng nhau, one by one