一、map结构简介
1.数组、切片的问题
names := []string{"Alicy","Bob","Mike","Rita"}
//想要取出Mike的名字,我们需要数一数,Mike在第三个位置
fmt.println(names[2])
有没有一种结构能够帮助我们快速 的取出数据呢?——map结构(字典结构)
2.map概念
Go语言中的字典结构是由键和值构成的,所谓键类似于新华字典的部首或者拼音,可以快速的查询对应的数据。字典的键是不允许重复的,具有唯一性,就像身份证号一样。
map是一种无序的键值对的集合。
map最重要的一点是通过key来快速的检索数据,key类似于索引,指向数据的值。
二、map的创建与初始化
1.map的创建
- var map名称 map[键的类型]值的类型
var m map[int]string //键为int类型,值为string类型
- map名称 := map[键的类型]值的类型{}
m := map[int]string{} //键的类型为int,值的类型为string
- make(map[键的类型]值的类型)
m := make(map[int]string) //键的类型为int,值的类型为string
2.初始化
- var map名称 map[键的类型]值的类型
//键为int类型,值为string类型
var m map[int]string = map[int]string{1:"Bob",2:"Mike"}
- map名称 := map[键的类型]值的类型{}
//键的类型为int,值的类型为string
m := map[int]string{1:"Bob",2:"Mike"}
- make(map[键的类型]值的类型)
//键的类型为int,值的类型为string
m := make(map[int]string)
m[1] = "Mike"
m[2] = "Bob"
m[2] = "Rita" //这种情况下,key如果一致的话,是完成修改,编译不会报错
三、map 的键与值
- 通过key获取值
package main
import "fmt"
func main() {
m := map[int]string{1:"Bob",2:"Mike"}
fmt.Println(m[1])
}
输出:
Bob
- 通过key获取值时,判断是否存在
package main
import "fmt"
func main() {
m := map[int]string{1:"Bob",2:"Mike"}
value,ok := m[1]
if ok{
fmt.Println(value)
}else {
fmt.Println("不存在该value")
}
value,ok = m[3]
if ok{
fmt.Println(value)
}else {
fmt.Println("不存在该value")
}
}
输出:
Bob
不存在该value
- 通过循环的方式获取值
package main
import (
"fmt"
)
func main() {
m := map[int]string{1:"Bob",2:"Mike"}
for key,value := range m{
fmt.Println(key,":",value)
}
}
输出:
1 : Bob
2 : Mike
- 通过key删除某个值
package main
import "fmt"
func main() {
m := map[int]string{1:"Bob",2:"Mike"}
delete(m,2)
fmt.Println(m)
}
输出:
map[1:Bob]
三、map作为函数参数
1.基本语法
//定义一个函数将map传参
func 函数名(map){
函数体
}
//调用
函数名(map)
package main
import "fmt"
func main() {
m := map[int]string{1:"Bob",2:"Mike"}
PrintMap(m)
}
func PrintMap(m map[int]string) {
fmt.Println(m)
}
输出:
map[1:Bob 2:Mike]
2.注意事项
在函数中修改或删除map的值,会影响到原map。
package main
import "fmt"
func main() {
m := map[int]string{1:"Bob",2:"Mike"}
PrintMap(m)
}
func PrintMap(m map[int]string) {
m[2] = "我在函数执行时被修改了..."
fmt.Println(m)
}
输出:
map[1:Bob 2:我在函数执行时被修改了...]
四、map案例
有一个英文字符串,统计每个字母出现的次数。
package main
import "fmt"
func main() {
s := "abcdfgghhwraaaaaaaaaaa"
m := CountOfAbc(s)
for key,value := range m{
fmt.Println(key,":出现",value,"次")
}
}
func CountOfAbc(s string) map[string]int {
m := map[string]int{}
for _,value := range s{
//fmt.Println(string(value))
m[string(value)] += 1
}
return m
}
输出:
a :出现 12 次
c :出现 1 次
h :出现 2 次
w :出现 1 次
b :出现 1 次
d :出现 1 次
f :出现 1 次
g :出现 2 次
r :出现 1 次