一、Map
1、Map的定义
在Go中,提供了一种映射关系的容器类型`map`,其内部实现为散列表(hash)。`map`是一种无序且基于`key-value`的数据类型,且`key`在`map`中只能够出现一次。`map`属于引用类型,需要初始化后才能够使用。
map
的定义如下:
map[键类型]值类型
- 键类型:表示
map
中键的数据类型 - 值类型:表示
map
中键对应的值数据类型
map
类型的变量默认初始化为nil
,在使用map
前,需要使用make()
函数来分配内存初始化。使用make
的语法如下:
make(map[键类型]值类型, [cap])
上述表达式中,cap
表示map
的容量,该参数不是必填参数,但在初始化map
时,应该为其指定一个合适的容量。
2、Map的使用
(1)基本使用
在使用make
初始化一个map
后,可以为map
添加对应类型的键值。
func main() {
m := make(map[string]int, 10)
m["Go"] = 100
m["Java"] = 90
fmt.Println(m) // map[Go:100 Java:90]
fmt.Println(m["Go"]) // 100
fmt.Printf("m的类型:%T\n", m) // map[Go:100 Java:90]
}
另外,map
也支持在声明时添加键值对。例如:
func main() {
userInfo := map[string]string{
"username": "serena",
"password": "123456",
}
fmt.Println(userInfo) // map[password:123456 username:serena]
}
(2)键是否存在
在使用map
时,如果需要判断某个键是否存在,则可以使用如下格式:
value, ok := map[key]
例如:
func main() {
searchMap := map[string]string{
"Go": "Go",
"Java": "Java",
}
if value, ok := searchMap["Go"]; ok {
fmt.Println(value) // Go
} else {
fmt.Println("未检索到该键值")
}
}
(3)遍历
map可以通过for range
实现map中键值的遍历
func main() {
searchMap := make(map[string]string)
searchMap["Go"] = "Go"
searchMap["Java"] = "Java"
searchMap["MySQL"] = "MySQL"
for k, v := range searchMap {
fmt.Printf("key: %s, value: %s\n", k, v)
}
}
// 执行结果
key: Java, value: Java
key: MySQL, value: MySQL
key: Go, value: Go
上述代码通过使用for range
对map进行遍历,从执行结果可以看出,遍历map
时的元素顺序与添加键值对的顺序无关。
(4)删除键值对
在Go中提供了内置函数delete()
,该函数可以从map中删除键值对,delete()
的使用如下:
delete(map, key)
map
:需要删除键值对的map
key
:需要删除键值对的键值
例如:
func main() {
searchMap := make(map[string]string)
searchMap["Go"] = "Go"
searchMap["Java"] = "Java"
searchMap["MySQL"] = "MySQL"
delete(searchMap, "MySQL")
for k, v := range searchMap {
fmt.Printf("key: %s, value: %s\n", k, v)
}
}
// 执行结果
key: Go, value: Go
key: Java, value: Java