map
- 概念:Go语言中 map 是一种特殊的数据结构,一种元素对(pair)的无序集合,包含一个key和value值,被称为关联数组或字典。
- 初始化
- 判空: !ok
- 遍历: 一般遍历、条件遍历
- 删除
- 查: 若在map中找不到某个key,则返回key对应类型的零值,e.g. int对应0,string对应空,bool对应false
- slice与map的组合
- 练习题:字符统计和回文判断
package main
import (
"fmt"
"strings"
)
func main() {
//初始化
var a = make(map[string]int)
a["勇者的等级"] = 10 //赋值
a["勇者的HP"] = 107
a["勇者的MP"] = 55
a["勇者的攻击力"] = 99
a["勇者的防御力"] = 99
fmt.Println(a)
//判空
//设变量名为ok的布尔值来判空,注意这里的ok仅是布尔型,和创建map时初始化的数据类型无关!!!
v, ok := a["勇者的等级"]
if !ok {
fmt.Println("无此属性")
} else {
fmt.Println(v)
}
fmt.Println(a["勇者的颜值"]) //查无此key,则返回值为int的零值
//遍历
//1.一般遍历 for range
for v, k := range a {
fmt.Println(v, k)
}
//2.条件遍历
//步骤:将key存入切片,用sort对该切片进行排序,再存入map,最后遍历
//删除
fmt.Println(a)
delete(a, "勇者的防御力")
fmt.Println(a)
//slice与map的组合
//元素类型为map的slice
A := make([]map[string]int, 4, 4)
fmt.Println(A)
A[0] = a
fmt.Println(A)
//元素类型为slice的map
B := make(map[string][]string, 2)
fmt.Println(B)
B["拯救公主的勇士"] = []string{"莱安", "杜鲁特"}
fmt.Println(B)
//vs code下如果不对内部的slice或map进行初始化,则会报错
//练习题
//对字符串中出现的单词出现次数进行统计
s2 := "the beauty of summer is transient,but poetry can last forever"
s3 := strings.Split(s2, " ") //以空格切割字符串,并存入切片s3
m1 := make(map[string]int, 10) //创建一个map,变量名为m1
for _, w := range s3 { //对切片s3遍历,并将切片中的value存入w
if _, ok := m1[w]; !ok { //用布尔ok对m1进行判空,循环的第一步:m1中不存在["how"],所以ok为零值
m1[w] = 1 //将w存入m1,并赋值为1
} else {
m1[w]++ //若m1中存在w,则使m1[w]的值增加1
}
}
for v, k := range m1 { //对m1遍历打印
fmt.Println(v, k)
}
//回文判断
E := "上海自来水来自海上"
R := make([]rune, 0, len(E))
for _, i := range E {
R = append(R, i)
}
for i := 0; i < len(R); i++ {
if R[i] != R[len(R)-1-i] {
fmt.Println("E不是回文")
return
}
}
fmt.Println(R)
fmt.Println("E是回文")
}
运行结果:
map[勇者的HP:107 勇者的MP:55 勇者的攻击力:99 勇者的等级:10 勇者的防御力:99]
10
0
勇者的防御力 99
勇者的等级 10
勇者的HP 107
勇者的MP 55
勇者的攻击力 99
map[勇者的HP:107 勇者的MP:55 勇者的攻击力:99 勇者的等级:10 勇者的防御力:99]
map[勇者的HP:107 勇者的MP:55 勇者的攻击力:99 勇者的等级:10]
[map[] map[] map[] map[]]
[map[勇者的HP:107 勇者的MP:55 勇者的攻击力:99 勇者的等级:10] map[] map[] map[]]
map[]
map[拯救公主的勇士:[莱安 杜鲁特]]
is 1
forever 1
last 1
the 1
beauty 1
of 1
summer 1
transient,but 1
poetry 1
can 1
[19978 28023 33258 26469 27700 26469 33258 28023 19978]
E是回文
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。