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)
}

参考:http://www.topgoer.com/go%E5%9F%BA%E7%A1%80/Map.html

posted @ 2023-10-12 18:37  橙子家  阅读(51)  评论(0编辑  收藏  举报