多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[TOC] # Map Go语言中提供的映射关系容器为`map`,其内部使用`散列表(hash)`实现,所以它是一种`无序`的基于`key-value`的数据结构,同时也是一种引用类型,必须初始化才能使用。 ## map定义 ~~~ map[KeyType]ValueType ~~~ * KeyType:表示键的类型。 * ValueType:表示键对应的值的类型。 map类型的变量默认初始值为`nil`,需要使用make()函数来分配内存。语法为: ~~~ make(map[KeyType]ValueType, [cap]) ~~~ 其中`cap`表示map的容量,该参数虽然不是必须的,但是我们应该在初始化map的时候就为其指定一个合适的容量。 ## map基本使用 map中的数据都是成对出现的 ~~~go func main() { scoreMap := make(map[string]int, 8) scoreMap["大雄"] = 90 scoreMap["胖虎"] = 100 fmt.Println(scoreMap) fmt.Println(scoreMap["大雄"]) fmt.Printf("type of a:%T\n", scoreMap) } ~~~ output: ~~~bash map[大雄:90 胖虎:100] 90 type of a:map[string]int ~~~ map也支持在声明的时候填充元素 eg: ~~~ userInfo := map[string]int{ "roomNum": 2021, "age": 18, } fmt.Println(userInfo) // ~~~ ## 判断某个键是否存在 格式:`value, ok := map[key]` ~~~ func main() { scoreMap := make(map[string]int) scoreMap["大雄"] = 99 scoreMap["小叮当"] = 18 // 如果key存在ok为true,v为对应的值;不存在ok为false,v为值类型的零值 v, ok := scoreMap["大雄"] if ok { fmt.Println(v) } else { fmt.Println("小心胖虎揍你!") } } ~~~ ## map的遍历 `for range`遍历map。 ~~~go func main() { scoreMap := make(map[string]int) scoreMap["大雄"] = 99 scoreMap["小叮当"] = 18 scoreMap["静香"] = 98 for k, v := range scoreMap { fmt.Println(k, v) } } ~~~ 只想遍历key的时候 ~~~go func main() { scoreMap := make(map[string]int) scoreMap["大雄"] = 99 scoreMap["小叮当"] = 18 scoreMap["静香"] = 98 for k := range scoreMap { fmt.Println(k) } } ~~~ **注意:**遍历map时的元素顺序与添加键值对的顺序无关。 ## 使用delete()函数删除键值对 格式:`delete(map,key)` ~~~ func main(){ scoreMap := make(map[string]int) scoreMap["大雄"] = 99 scoreMap["小叮当"] = 18 scoreMap["静香"] = 98 //因为大雄和小叮当是真爱,那就删除静香吧 delete(scoreMap, "静香") for k := range scoreMap { fmt.Println(k) } } ~~~ output: ~~~ 大雄 小叮当 ~~~ ## 按照指定顺序遍历map ~~~ func main() { rand.Seed(time.Now().UnixNano()) //初始化随机数种子 var scoreMap = make(map[string]int, 200) for i := 0; i < 100; 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]) } } ~~~ ## 元素为map类型的切片 ~~~ func main() { var mapSlice = make([]map[string]string, 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) mapSlice[0]["name"] = "小叮当" mapSlice[0]["age"] = "18" mapSlice[0]["address"] = "北京" for index, value := range mapSlice { fmt.Printf("index:%d value:%v\n", index, value) } } ~~~ ## 值为切片类型的map ~~~ func main() { var sliceMap = make(map[string][]string, 3) key := "哆啦A梦" value, ok := sliceMap[key] if !ok { value = make([]string, 0, 2) } value = append(value, "大雄", "小叮当") sliceMap[key] = value fmt.Println(sliceMap)//map[哆啦A梦:[大雄 小叮当]] } ~~~