map的基本使用 详情参考https://www.liwenzhou.com/posts/Go/08_map/
//map的基本使用
//map类型的变量默认初始值为nil,需要使用make()函数来分配内存
func main() {
scorceMap := make(map[string]int, 8)
scorceMap["张三"] = 90 //向scoreMap中添加一对键值对
scorceMap["李四"] = 66 //同上
fmt.Println(scorceMap) //打印现有map中所有的内容
fmt.Println(scorceMap["张三"]) //打印键为张三对应的值
fmt.Printf("type of a:%T\n", scorceMap) //打印scorceMap的类型信息
}
输出结果:
C:\Users\34826\AppData\Local\Temp\___go_build_code_oldboy_com_studygolang_05lesson5_lesson1.exe #gosetup
map[张三:90 李四:66]
90
type of a:map[string]int
注释:map是引用类型.与channel ,slice,map 都需要使用make进行初始化,进行内存分配.
//声明map的时候直接初始化赋值
//声明map的时候直接填充map内容
func main() {
userInfo := map[string]int{ //直接使用:= 声明map并对map进行初始化赋值
"张三": 99,
"李四": 98,
"王五": 97,
}
fmt.Println(userInfo) //虽然这里使用的是println进行输出.但是打印出的内容是在一行中的.因为打印的map是一个整体.并没有做遍历操作.
}
输出结果:
C:\Users\34826\AppData\Local\Temp\___go_build_code_oldboy_com_studygolang_05lesson5_lesson1.exe #gosetup
map[张三:99 李四:98 王五:97]
//判断key是否在map中
//声明map的时候直接填充map内容
func main() {
userInfo := map[string]int{ //直接使用:= 声明map并对map进行初始化赋值
"张三": 99,
"李四": 98,
"王五": 97,
}
fmt.Println(userInfo) //虽然这里使用的是println进行输出.但是打印出的内容是在一行中的.因为打印的map是一个整体.并没有做遍历操作.
//判断map中是否有某个键值
value, ok := userInfo["张三"] //在map中取值会返回一个值内容,和一个bool值.如果成功返回key内容那么bool值就是true.否则就是false
if ok {
fmt.Println("张三:", value)
} else {
fmt.Println("张三不存在")
}
}
输出结果:
C:\Users\34826\AppData\Local\Temp\___go_build_code_oldboy_com_studygolang_05lesson5_lesson1.exe #gosetup
Process finished with exit code 0
map[张三:99 李四:98 王五:97]
张三: 99
遍历map
//遍历map
func main() { //遍历键值,
scoreMap := map[string]int{
"张三": 99,
"张思": 95,
"张武": 98,
}
for k, v := range scoreMap { //使用range遍历整个键值对.
fmt.Println(k, v)
}
}
输出结果:
C:\Users\34826\AppData\Local\Temp\___go_build_code_oldboy_com_studygolang_05lesson5_lesson1.exe #gosetup
张三 99
张思 95
张武 98
这里遍历的是整个键值对.
只遍历键或者之遍历值
func main() { //遍历键值,
scoreMap := map[string]int{
"张三": 99,
"张思": 95,
"张武": 98,
}
for k := range scoreMap {
fmt.Println("scorMap的键为: ", k) //这里只遍历map的所有键.
}
for _, v := range scoreMap {
fmt.Println("scorMap的键为: ", v) //这里只遍历map的所有值,将键舍弃
}
}
输出结果:
C:\Users\34826\AppData\Local\Temp\___go_build_code_oldboy_com_studygolang_05lesson5_lesson1.exe #gosetup
scorMap的键为: 张三
scorMap的键为: 张思
scorMap的键为: 张武
scorMap的键为: 99
scorMap的键为: 95
scorMap的键为: 98
delete()方法删除map中的键值对
//使用delete()删除键值对
//delete(map,key) 这里只要指定删除哪个map中的哪个键
func main() {
scoreMap := map[string]int{
"张三": 111,
"李四": 122,
"F4": 112,
"大铁锤": 44,
}
fmt.Println(scoreMap) //打印map
delete(scoreMap, "F4") //这里将scoreMap中的F4键值对删除,
fmt.Println(scoreMap) //打印map
}
输出结果:
C:\Users\34826\AppData\Local\Temp\___go_build_main_go.exe #gosetup
map[F4:112 大铁锤:44 张三:111 李四:122]
map[大铁锤:44 张三:111 李四:122]
这里看到第二次打印map的时候里面的元素已经将f4:122删除掉了
map的顺序取值
func main() {
rand.Seed(time.Now().UnixNano()) //初始化随机数种子
var scoreMap = make(map[string]int, 200)
for i := 0; i < 10; i++ {
key := fmt.Sprintf("stu%02d", i) //生成stu开头的字符串
value := rand.Intn(10) //生成0~99的随机整数
scoreMap[key] = value
}
//取出map中的所有key存入切片keys
var keys = make([]string, 0, 200)
for key := range scoreMap {
keys = append(keys, key)
}
//对切片进行排序
sort.Strings(keys)
//将切片中的值取出(map中的键)并循环打印出结果
for _, i := range keys {
fmt.Println(i, scoreMap[i])
}
}
输出结果:
C:\Users\34826\AppData\Local\Temp\___go_build_code_oldboy_com_studygolang_05lesson5_lesson1.exe #gosetup
stu00 3
stu01 5
stu02 4
stu03 5
stu04 9
stu05 7
stu06 6
stu07 3
stu08 3
stu09 2
元素为map的切片
//元素为map类型的切片
func main() {
//先声明一个map类型的切片
scoreMapSlice := make([]map[string]string, 5)
//定义一个变量item是map类型
for i := range scoreMapSlice { //将切片里面的元素遍历出来
scoreMapSlice[i] = make(map[string]string) //表示将所有的元素都定义成map类型
//修改item的值
num := fmt.Sprintf("num%2d", i)
scoreMapSlice[i][num] = fmt.Sprintf("大侠饶命%d", i) //前部部分的scoreMapSlice[i]表示列表中某一个单独的map.
// [num], 表示这个map的键,
//如果要给键赋值的话那就表示是一个完整的键值对关系.这个过程是一个直接赋值的过程.
}
fmt.Println(scoreMapSlice) //打印完整的map类型的切片
}
输出结果:
C:\Users\34826\AppData\Local\Temp\___go_build_code_oldboy_com_studygolang_05lesson5_lesson1.exe #gosetup
[map[num 0:大侠饶命0] map[num 1:大侠饶命1] map[num 2:大侠饶命2] map[num 3:大侠饶
命3] map[num 4:大侠饶命4]]
作业1 这道题现在也不明白为啥结果是133
func main() {
type Map map[string][]int
m := make(Map)
s := []int{1, 2}
s = append(s, 3)
fmt.Printf("%+v\n", s)
m["q1mi"] = s
s = append(s[:1], s[2:]...)
fmt.Printf("%+v\n", s)
fmt.Printf("%+v\n", m["q1mi"])
}
输出结果
C:\Users\34826\AppData\Local\Temp\___go_build_code_oldboy_com_studygolang_05lesson5_lesson1.exe #gosetup
[1 2 3]
[1 3]
[1 3 3]
为啥最后的结果是133???
//作业2写一个程序,统计一个字符串中每个单词出现的次数例如 how do you do!
func main() {
s1 := "how do you do !" //原始字符串
m := make(map[string]int) //初始化一个map类型
S := strings.Split(s1, " ") //将字符串按照空格为分隔符的形式转换成切片
for _, v := range S { //循环切片中的内容,并取出切片中的值(map的键)
m[v] = m[v] + 1 //每次有相同的map都会+1,因为定义的初始化map中没有值,不太明白为啥map的键相加后值会累积.
}
for i, v := range m {
fmt.Println(i, v) //打印map的键值对
}
}
输出结果
C:\Users\34826\AppData\Local\Temp\___go_build_code_oldboy_com_studygolang_05lesson5_lesson1.exe #gosetup
! 1
how 1
do 2
you 1