Đi bản đồ
Đi bản đồ
Bản đồ được sử dụng để lưu trữ các giá trị dữ liệu theo cặp khóa: giá trị.
Mỗi phần tử trong bản đồ là một cặp khóa:giá trị.
Bản đồ là một bộ sưu tập không có thứ tự và có thể thay đổi, không cho phép trùng lặp.
Độ dài của bản đồ là số phần tử của nó. Bạn có thể tìm thấy nó bằng hàm len()
.
Giá trị mặc định của bản đồ là không.
Bản đồ chứa các tham chiếu đến bảng băm cơ bản.
Go có nhiều cách để tạo bản đồ.
Tạo bản đồ bằng var
và :=
Cú pháp
var a = map[KeyType]ValueType{ key1 : value1 , key2 : value2 ,...}
b := map[KeyType]ValueType{ key1 : value1 , key2 : value2 ,...}
Ví dụ
Ví dụ này cho thấy cách tạo bản đồ trong Go. Lưu ý thứ tự trong mã và trong đầu ra
package main
import ("fmt")
func main() {
var a = map[string]string{"brand": "Ford", "model": "Mustang", "year": "1964"}
b := map[string]int{"Oslo": 1, "Bergen": 2, "Trondheim": 3, "Stavanger": 4}
fmt.Printf("a\t%v\n", a)
fmt.Printf("b\t%v\n", b)
}
Kết quả:
a map[brand:Ford model:Mustang year:1964]
b map[Bergen:2 Oslo:1 Stavanger:4 Trondheim:3]
Lưu ý: Thứ tự của các thành phần bản đồ được xác định trong mã khác với cách chúng được lưu trữ. Dữ liệu được lưu trữ theo cách để truy xuất dữ liệu hiệu quả từ bản đồ.
Tạo bản đồ bằng make()
:
Cú pháp
var a = make(map[KeyType]ValueType)
b := make(map[KeyType]ValueType)
Ví dụ
Ví dụ này cho thấy cách tạo bản đồ trong Go bằng hàm make()
.
package main
import ("fmt")
func main() {
var a = make(map[string]string) // The map is empty now
a["brand"] = "Ford"
a["model"] = "Mustang"
a["year"] = "1964"
// a is no longer empty
b := make(map[string]int)
b["Oslo"] = 1
b["Bergen"] = 2
b["Trondheim"] = 3
b["Stavanger"] = 4
fmt.Printf("a\t%v\n", a)
fmt.Printf("b\t%v\n", b)
}
Kết quả:
a map[brand:Ford model:Mustang year:1964]
b map[Bergen:2 Oslo:1 Stavanger:4 Trondheim:3]
Tạo một bản đồ trống
Có hai cách để tạo một bản đồ trống. Một là sử dụng hàm make()
và hai là sử dụng cú pháp sau.
Cú pháp
var a map[KeyType]ValueType
Lưu ý: Hàm make()
là cách phù hợp để tạo bản đồ trống. Nếu bạn tạo một bản đồ trống theo một cách khác và ghi vào đó, nó sẽ gây ra tình trạng hoảng loạn khi chạy.
Ví dụ
Ví dụ này cho thấy sự khác biệt giữa việc khai báo một bản đồ trống bằng cách sử dụng hàm make()
và không sử dụng hàm này.
package main
import ("fmt")
func main() {
var a = make(map[string]string)
var b map[string]string
fmt.Println(a == nil)
fmt.Println(b == nil)
}
Kết quả:
false
true
Các loại khóa được phép
Khóa bản đồ có thể thuộc bất kỳ loại dữ liệu nào mà toán tử đẳng thức ( ==
) được xác định. Bao gồm các:
- Boolean
- số
- Dây
- Mảng
- Con trỏ
- Cấu trúc
- Giao diện (miễn là loại động hỗ trợ sự bình đẳng)
Các loại khóa không hợp lệ là:
- lát
- Bản đồ
- Chức năng
Những loại này không hợp lệ vì toán tử đẳng thức ( ==
) không được xác định cho chúng.
Loại giá trị được phép
Các giá trị bản đồ có thể là bất kỳ loại nào.
Truy cập các phần tử bản đồ
Bạn có thể truy cập các thành phần bản đồ bằng cách:
Cú pháp
value = map_name [key]
Ví dụ
package main
import ("fmt")
func main() {
var a = make(map[string]string)
a["brand"] = "Ford"
a["model"] = "Mustang"
a["year"] = "1964"
fmt.Printf(a["brand"])
}
Kết quả:
Ford
Cập nhật và thêm các thành phần bản đồ
Việc cập nhật hoặc thêm một phần tử được thực hiện bằng cách:
Cú pháp
map_name [key] = value
Ví dụ
Ví dụ này cho thấy cách cập nhật và thêm các phần tử vào bản đồ.
package main
import ("fmt")
func main() {
var a = make(map[string]string)
a["brand"] = "Ford"
a["model"] = "Mustang"
a["year"] = "1964"
fmt.Println(a)
a["year"] = "1970" // Updating an element
a["color"] = "red" // Adding an element
fmt.Println(a)
}
Kết quả:
map[brand:Ford model:Mustang year:1964]
map[brand:Ford color:red model:Mustang year:1970]
Xóa phần tử khỏi bản đồ
Việc xóa các phần tử được thực hiện bằng hàm delete()
.
Cú pháp
delete( map_name , key)
Ví dụ
package main
import ("fmt")
func main() {
var a = make(map[string]string)
a["brand"] = "Ford"
a["model"] = "Mustang"
a["year"] = "1964"
fmt.Println(a)
delete(a,"year")
fmt.Println(a)
}
Kết quả:
map[brand:Ford model:Mustang year:1964]
map[brand:Ford model:Mustang]
Kiểm tra các yếu tố cụ thể trong bản đồ
Bạn có thể kiểm tra xem một khóa nhất định có tồn tại trên bản đồ hay không bằng cách sử dụng:
Cú pháp
val , ok := map_name [key]
Nếu bạn chỉ muốn kiểm tra sự tồn tại của một khóa nhất định, bạn có thể sử dụng mã định danh trống ( _
) thay cho val.
Ví dụ
package main
import ("fmt")
func main() {
var a = map[string]string{"brand": "Ford", "model": "Mustang", "year": "1964", "day":""}
val1, ok1 := a["brand"] // Checking for existing key and its value
val2, ok2 := a["color"] // Checking for non-existing key and its value
val3, ok3 := a["day"] // Checking for existing key and its value
_, ok4 := a["model"] // Only checking for existing key and not its value
fmt.Println(val1, ok1)
fmt.Println(val2, ok2)
fmt.Println(val3, ok3)
fmt.Println(ok4)
}
Kết quả:
Ford true
false
true
true
Ví dụ giải thích
Trong ví dụ này, chúng tôi đã kiểm tra sự tồn tại của các khóa khác nhau trên bản đồ.
Chìa khóa " color " không tồn tại trên bản đồ. Vì vậy giá trị là một chuỗi rỗng ('').
Biến ok2 được sử dụng để tìm hiểu xem khóa có tồn tại hay không. Bởi vì chúng ta sẽ có cùng giá trị nếu giá trị của khóa "color" trống. Đây là trường hợp của val3 .
Bản đồ là tài liệu tham khảo
Bản đồ là tham chiếu đến bảng băm.
Nếu hai biến bản đồ tham chiếu đến cùng một bảng băm, việc thay đổi nội dung của một biến sẽ ảnh hưởng đến nội dung của biến kia.
Ví dụ
package main
import ("fmt")
func main() {
var a = map[string]string{"brand": "Ford", "model": "Mustang", "year": "1964"}
b := a
fmt.Println(a)
fmt.Println(b)
b["year"] = "1970"
fmt.Println("After change to b:")
fmt.Println(a)
fmt.Println(b)
}
Kết quả:
map[brand:Ford model:Mustang year:1964]
map[brand:Ford model:Mustang
year:1964]
After change to b:
map[brand:Ford model:Mustang year:1970]
map[brand:Ford model:Mustang year:1970]
Lặp lại bản đồ
Bạn có thể sử dụng range
để lặp lại trên bản đồ.
Ví dụ
Ví dụ này cho thấy cách lặp lại các phần tử trong bản đồ. Lưu ý thứ tự của các phần tử trong đầu ra.
package main
import ("fmt")
func main() {
a := map[string]int{"one": 1, "two": 2, "three": 3, "four": 4}
for k, v := range a {
fmt.Printf("%v : %v, ", k, v)
}
}
Kết quả:
two : 2, three : 3, four : 4, one : 1,
Lặp lại các bản đồ theo một thứ tự cụ thể
Bản đồ là cấu trúc dữ liệu không có thứ tự. Nếu bạn cần lặp lại trên bản đồ theo một thứ tự cụ thể, bạn phải có cấu trúc dữ liệu riêng chỉ định thứ tự đó.
Ví dụ
package main
import ("fmt")
func main() {
a := map[string]int{"one": 1, "two": 2, "three": 3, "four": 4}
var b []string // defining the order
b = append(b, "one", "two", "three", "four")
for k, v := range a { // loop with no order
fmt.Printf("%v : %v, ", k, v)
}
fmt.Println()
for _, element := range b { // loop with the defined order
fmt.Printf("%v : %v, ", element, a[element])
}
}
Kết quả:
two : 2, three : 3, four : 4, one : 1,
one : 1, two : 2, three : 3, four : 4,