map是golang 的内置类型,也叫映射。
Golang 中的映射是一个哈希表,是键值对的集合。
映射中所有的键都必须具有相同的类型,它们的值也是如此。 不过,可对键和值使用不同的类型。 例如,键可以是数字,值可以是字符串。 若要访问映射中的特定项,可引用该项的键。
创建map
可以使用内置函数make(Type, len, cap)
创建map。
make(map[type of key]type of value)
创建map的方式主要有三种:
func main() {
// 1. 先声明,然后分配内存
var map1 map[string]int
// map1["Jack"] = 10 // map1 没有分配内存,不能直接赋值
map1 = make(map[string]int)
map1["Jack"] = 80
fmt.Println(map1)
// 2. 直接创建并分配内存
map2 := make(map[string]int)
map2["Jack"] = 90
map2["Lucy"] = 100
fmt.Println(map2)
// 3. 初始化赋值,并动态分配内存
map3 := map[string]int{
"Jack": 100,
"Lily": 90,
}
fmt.Println(map3)
}
//输出:
//map[Jack:80]
//map[Jack:90 Lucy:100]
//map[Jack:100 Lily:90]
map的零值是
nil
, 即上述只声明没有分配内存的map,是不能直接赋值的。
map取值
func main() {
student := map[string]int{
"Jack": 100,
}
JackScore := student["Jack"]
LucyScore := student["Lucy"]
fmt.Printf("Jack's score is %d\n", JackScore)
fmt.Printf("Jack's score is %d", LucyScore)
// Jack's score is 100
// 当取值的key在map中不存在时,将返回map value类型的零值
// Jack's score is 0
}
检查key是否存在
value, ok := map[key]
如果ok 为true
, 则key存在,否则不存在。
map的迭代
可以使用 for key, value := range map
对map中的元素进行迭代
func main() {
student := map[string]int{
"Jack": 100,
"Jack Ma": 20,
}
for key, value := range student {
fmt.Printf("%s 's socre is %d\n", key, value)
}
//输出:
//Jack 's socre is 100
//Jack Ma 's socre is 20
}
for range
迭代不能保证顺序。
删除map中的元素
delete(map, key)
如果删除一个不存在的key,并不会报错。
map的长度length
可以使用 len(map)
获取map的length
fmt.Printf("student map's length:%d", len(student))
map是引用类型吗?
和slice
一样,map
是引用类型。
func main() {
student := map[string]int{
"Jack": 100,
"Jack Ma": 20,
}
studentA := student
studentA["Jack Ma"] = 80
for s, i := range student {
fmt.Printf("student[%s] = %d\n", s, i)
}
// 输出:
// student[Jack] = 100
// student[Jack Ma] = 80
}
map的比较
map是引用类型,不可以直接使用==
操作符进行比较。
如果要比较两个map是否相等,可以递归遍历每个元素进行比较,或使用反射。