1.map
- map是一种无序的基于key-value的数据结构,Go语言中的map是引用类型,必须初始化才能使用。map如果不做初始化,它就是个nil
- map定义:
- Go语言中map的定义语法:
map[keytype]ValueType
- 其中:
- keyType 表示键的类型
- ValueType表示键对应的值的类型
- 初识map:
package main
import "fmt"
//map(映射)
func main() {
//键是字符串类型,值是int类型
//只是声明map类型,但是没有初始化,没有初始化默认a就是初始值nil
var a map[string]int
fmt.Println(a == nil)//true
//map的初始化
a = make(map[string]int, 8)
fmt.Println(a == nil)//false
fmt.Println(a)//map[]
}
- map中添加键值对
package main
import "fmt"
//map(映射)
func main() {
//map的初始化
a := make(map[string]int, 8)
//map中如何添加键值对
a["皮城女警"] = 150
a["赏金猎人"] = 200
fmt.Println(a)
fmt.Printf("a:%#v\n", a)//连数据类型和数据都显示
fmt.Printf("type:%T\n", a)
}
// map[皮城女警:150 赏金猎人:200]
// a:map[string]int{"皮城女警":150, "赏金猎人":200}
// type:map[string]int
- 声明map的同时完成初始化
package main
import "fmt"
//map(映射)
func main() {
//声明map的同时完成初始化
b := map[int]bool{
1: true,
2: false,
}
fmt.Printf("b:%#v\n", b)
fmt.Printf("type:%T", b)
}
//b:map[int]bool{1:true, 2:false}
//type:map[int]bool
- 判断 值是否在map中
//map(映射)
package main
import "fmt"
func main() {
//判断某个键存不存在
var scoreMap = make(map[string]int, 8)
scoreMap["小明"] = 99
scoreMap["小红"] = 89
//判断 小刚 在不在scoreMap中
v, ok := scoreMap["小刚"]
fmt.Println(v, ok)// 0 false
if ok {
fmt.Println("小刚在scoreMap中")
} else {
fmt.Println("查无此人") // 查无此人
}
}
- map的遍历(使用for...range)
- map是无序的,键值对和添加的顺序无关
package main
import "fmt"
//map(映射)
func main() {
//map的遍历
var scoreMap = make(map[string]int, 8)
scoreMap["小明"] = 99
scoreMap["小红"] = 89
scoreMap["小刚"] = 65
//for range遍历
for k, v := range scoreMap {
fmt.Println(k, v)
}
//只遍历key
for k := range scoreMap {
fmt.Println(k)
}
//只遍历value
for _, v := range scoreMap {
fmt.Println(v)
}
}
//小刚 65
//小明 99
//小红 89
- 使用delete函数删除map键值对
package main
import "fmt"
//map(映射)
func main() {
var scoreMap = make(map[string]int, 8)
scoreMap["小明"] = 99
scoreMap["小红"] = 89
scoreMap["小刚"] = 65
//删除小刚 这个键值对
delete(scoreMap, "小刚")
fmt.Println(scoreMap)
}
- 按照key从小到大的顺序去遍历scoreMap
package main
import "fmt"
import "sort"
import "math/rand"
//map(映射)
func main() {
var scoreMap = make(map[string]int, 100)
//添加50个键值对
for i := 0; i < 50; i++ {
key := fmt.Sprintf("stu%02d", i)
value := rand.Intn(100) //0-99随机整数
scoreMap[key] = value
}
// for key, value := range scoreMap {
// fmt.Println(key, value)
// }
//按照key从小到大的顺序去遍历scoreMap
//1.先取出所有的key,存放到切片中
keys := make([]string, 0, 100)
for k := range scoreMap {
keys = append(keys, k)
}
//2.对key做排序
sort.Strings(keys) //keys是一个有序的切片
//3.按照排序后的key对应scoreMap排序
for _, key := range keys {
fmt.Println(key, scoreMap[key])
}
}
- 元素为map的切片
package main
import "fmt"
//map(映射)
func main() {
//元素为map的切片
var mapSlice = make([]map[string]int, 8, 8) //只完成了切片的初始化,没有完成map的初始化
//还需要完成内部map的元素初始化
mapSlice[0] = make(map[string]int, 8) //完成切片第一个map初始化
mapSlice[0]["xjk"] = 100
fmt.Println(mapSlice)
}
- 值为切片类型的map
package main
import "fmt"
//map(映射)
func main() {
//值为切片的map
var sliceMap = make(map[string][]int, 8) //只完成了map的初始化
v, ok := sliceMap["中国"]
if ok {
fmt.Println(v)
} else {
//sliceMap中没有中国这个键
sliceMap["中国"] = make([]int, 8) //完成了对切片的初始化
sliceMap["中国"][0] = 100
sliceMap["中国"][1] = 200
sliceMap["中国"][2] = 300
}
fmt.Println(sliceMap)
//遍历sliceMap
for k, v := range sliceMap {
fmt.Println(k, v)
}
}
- 练习题:统计一个字符串中每个单词出现的次数
package main
import (
"fmt"
"strings"
)
//map(映射)
func main() {
//统计一个字符串中每个单词出现次数
//"how do you do"中每个单词出现次数
temp := "how do you do"
//定义一个map[string]int
var wordCount = make(map[string]int, 10)
//字符串中都有哪些单词
words := strings.Split(temp, " ")
//遍历单词做统计
for _, word := range words {
v, ok := wordCount[word]
if ok {
wordCount[word] = v + 1
} else {
wordCount[word] = 1
}
}
for k, v := range wordCount {
fmt.Println(k, v)
}
// Printf 格式化输出。