map 简单梳理【GO 基础】
〇、map 简介
map 是一种无序的基于 key-value 的数据结构,Go 语言中的 map 是引用类型,必须初始化才能使用。
其中键可以是任何类型,但值必须是可比较的类型(如整数、字符串、布尔值等)。
一、map 的定义和使用
1.1 map 的定义
map[KeyType]ValueType // KeyType:表示键的类型 // ValueType:表示键对应的值的类型
map 类型的变量默认初始值为 nil,需要使用 make() 函数来分配内存。语法为:
make(map[KeyType]ValueType, [cap]) // cap:表示 map 的容量,非必须
1.2 map 的基本使用
map 中的数据都是成对出现的,map 的基本使用示例代码如下:
package main import "fmt" func main() { scoreMap := make(map[string]int, 8) scoreMap["张三"] = 90 scoreMap["李四"] = 100 fmt.Println(scoreMap) fmt.Println(scoreMap["李四"]) fmt.Printf("type of scoreMap : %T\n", scoreMap) // 声明时直接赋值 userInfo := map[string]bool{ "王五": true, } fmt.Println(userInfo) fmt.Printf("type of userInfo : %T\n", userInfo) }
1.3 判断某个键是否存在
Go 语言中有个判断 map 中键是否存在的特殊写法,格式如下:
value, ok := map[key] // 若 key 存在,则 ok = true,value 为对应的值,否则 ok = false
package main import "fmt" func main() { scoreMap := make(map[string]int) scoreMap["张三"] = 90 scoreMap["小明"] = 100 value, ok := scoreMap["张三"] if ok { fmt.Println(value) } else { fmt.Println("查无此人") } value2, ok := scoreMap["张三1"] if ok { fmt.Println(value2) } else { fmt.Println("查无此人") } }
1.4 map 的遍历
Go 语言中使用 for range 遍历 map。
package main import "fmt" func main() { scoreMap := make(map[string]int) scoreMap["张三"] = 90 scoreMap["李四"] = 100 scoreMap["王五"] = 60 for k, v := range scoreMap { // 只想遍历 k 时,v 可省略 fmt.Println(k, v) } }
注意:遍历 map 时的元素顺序与添加键值对的顺序无关。
1.5 通过 delete 删除键值对
使用 delete() 内建函数从 map 中删除一组键值对,delete() 函数的格式如下:
delete(map, key) // map 表示要从中删除键值对的 map 对象名 // key 表示要删除的键
package main import "fmt" func main() { scoreMap := make(map[string]int) scoreMap["张三"] = 90 scoreMap["李四"] = 100 scoreMap["王五"] = 60 delete(scoreMap, "李四") for k, v := range scoreMap { fmt.Println(k, v) } }
1.6 按照指定顺序遍历 map
map 本身是无序的,如果想按照顺序来遍历,可以将全部的 key 取出来自行排序,最后对这个排序后的键列表进行遍历,每次通过键取 map 中的值。如下示例代码:
package main import ( "fmt" "math/rand" "sort" ) func main() { var scoreMap = make(map[string]int, 20) for i := 0; i < 10; i++ { key := fmt.Sprintf("stu%02d", i) // 生成 stu 开头的字符串 value := rand.Intn(100) // 生成 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) // 按照排序后的 key 遍历 map for _, key := range keys { fmt.Println(key, scoreMap[key]) } }
1.7 元素可以是 map 类型的切片
package main import ( "fmt" ) func main() { var mapSlice = make([]map[string]string, 3) // 初始化一个 map 列表,长度为 3 的 for index, value := range mapSlice { fmt.Printf("index:%d value:%v\n", index, value) } fmt.Println("after init") // 对切片中的 map 元素进行初始化 mapSlice[0] = make(map[string]string, 10) // 初始化第一个切片的值为长度是 10 的 map,然后后续再进行赋值 mapSlice[0]["name"] = "王五" mapSlice[0]["password"] = "123456" mapSlice[0]["address"] = "红旗大街" for index, value := range mapSlice { fmt.Printf("index:%d value:%v\n", index, value) } }
1.8 值为切片类型的 map
package main import ( "fmt" ) func main() { var sliceMap = make(map[string][]string, 3) // 初始化一个长度为 3 的 map fmt.Println(sliceMap) fmt.Println("after init") key := "中国" value, ok := sliceMap[key] if !ok { value = make([]string, 0, 2) } value = append(value, "北京", "上海") // 往 value 中添加值 sliceMap[key] = value fmt.Println(sliceMap) }

本文来自博客园,作者:橙子家,欢迎微信扫码关注博主【橙子家czzj】,有任何疑问欢迎沟通,共同成长!
转载本文请注明原文链接:https://www.cnblogs.com/hnzhengfy/p/Go_map.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步