【入门】Go语言Map集合详解
目录
一、Map集合介绍
1.1 什么是Map集合?
- map集合是一种无序的键值对的集合
- map是通过key来快速检索数据,key类似于索引,指向数据的值
- 在获取 Map 的值时,如果键不存在,返回该类型的零值,例如 int 类型的零值是 0,string 类型的零值是 ""
- Map 是引用类型,如果将一个 Map 传递给一个函数或赋值给另一个变量,它们都指向同一个底层数据结构,因此对 Map 的修改会影响到所有引用它的变量
Map 是一种集合,所以我们可以像迭代数组和切片那样迭代它。不过,Map 是无序的,我们无法决定它的返回顺序,这是因为 Map 是使用 hash 表来实现的。
1.2 Map集合语法
mapVariable := make(map[KeyType]ValueType, initialCapacity)
- KeyType 是键的类型
- ValueType 是值的类型
- initialCapacity 是可选的参数,用于指定 Map 的初始容量
二、Map基本操作
2.1 定义Map
package main
import "fmt"
func main() {
// 定义一个空Map
siteMap := make(map[string]string)
fmt.Println(siteMap)
}
或者可以使用下面方法定义并初始化:
package main
import "fmt"
func main() {
siteMap := map[string]int{
"zhangsan": 1,
"lisi": 2,
"wangwu": 3,
}
fmt.Println(siteMap)
}
2.2 获取Map
如果键是存在的,"变量1"中存储对应的值,"变量2"的值为true,false。
package main
import "fmt"
func main() {
siteMap := map[string]int{
"zhangsan": 1666,
"lisi": 2666,
"wangwu": 3,
}
v1 := siteMap["zhangsan"] //将zhangsan键的值付给v1变量
v2, ok := siteMap["lisi"] //将lisi键值付给v1,ok两个变量
fmt.Println(v1)
fmt.Println(v2, ok)
}
代码输出内容:
1666
2666 true
2.3 修改Map元素
package main
import "fmt"
func main() {
siteMap := map[string]int{
"zhangsan": 1666,
"lisi": 2666,
"wangwu": 3,
}
siteMap["lisi"] = 666666 // 修改元素
fmt.Println(siteMap["lisi"])
}
代码输出内容:
666666
2.4 删除Map元素
package main
import "fmt"
func main() {
siteMap := map[string]int{
"zhangsan": 1666,
"lisi": 2666,
"wangwu": 3,
}
delete(siteMap, "zhangsan") // 删除元素
fmt.Println(siteMap)
}
代码输出内容:
map[lisi:2666 wangwu:3]
2.5 遍历Map
package main
import "fmt"
func main() {
siteMap := map[string]int{
"zhangsan": 1666,
"lisi": 2666,
"wangwu": 3,
}
for i, v := range siteMap {
fmt.Printf("键:%v\t\t值:%v\n", i, v)
}
}
代码输出内容:
键:zhangsan 值:1666
键:lisi 值:2666
键:wangwu 值:3
三、拓展
3.1 map作为函数参数
package main
import (
"fmt"
)
func main() {
m := map[string]int{"zhangsan": 17, "lisi": 18, "wangwu": 19, "maliu": 20}
PrintMap(m)
DeleteMap(m)
fmt.Println("=====================================")
PrintMap(m)
}
func PrintMap(m map[string]int) {
for i, k := range m {
fmt.Printf("key:%v\tvalue:%v\n", i, k)
}
}
func DeleteMap(m map[string]int) {
delete(m, "zhangsan")
}
代码输出内容:
key:zhangsan value:17
key:lisi value:18
key:wangwu value:19
key:maliu value:20
=====================================
key:lisi value:18
key:wangwu value:19
key:maliu value:20
3.2 案例一
package main
import (
"fmt"
)
func main() {
cities := make(map[string]string)
// 新增key
cities["no1"] = "北京"
cities["no2"] = "上海"
cities["no3"] = "深圳"
// 修改key,因为这个存在,索引是修改
cities["no3"] = "邯郸"
// 删除key
delete(cities, "no2")
fmt.Println(cities)
// 删除所有key 直接make一个新地址
cities = make(map[string]string)
fmt.Println(cities)
}
代码输出内容:
map[no1:北京 no3:邯郸]
map[]
3.3 案例二
package main
import "fmt"
func main() {
siteMap := make(map[string]string)
siteMap["A"] = "石家庄"
siteMap["B"] = "唐山"
siteMap["C"] = "秦皇岛"
siteMap["D"] = "邯郸"
for site := range siteMap {
fmt.Printf("车牌 %v 城市是: %v\n", site, siteMap[site])
}
name, ok := siteMap["D"]
if ok {
fmt.Println("D对应城市是:", name)
} else {
fmt.Println("D 没有定义!")
}
}
代码输出内容:
车牌 C 城市是: 秦皇岛
车牌 D 城市是: 邯郸
车牌 A 城市是: 石家庄
车牌 B 城市是: 唐山
D对应城市是: 邯郸
3.4 案例三
统计一个字符串中字母出现的次数
package main
import (
"fmt"
)
func main() {
var str string = "qinqinziteng666"
m := make(map[byte]int)
for i := 0; i < len(str); i++ {
ch := str[i]
m[ch] = m[ch] + 1 //int类型默认值是0
}
for i, v := range m {
fmt.Printf("%c出现了\t%d次\n", i, v)
}
}
代码输出内容:
e出现了 1次
g出现了 1次
6出现了 3次
q出现了 2次
i出现了 3次
n出现了 3次
z出现了 1次
t出现了 1次