一 . map的介绍

map是一种无序的基于key-value的数据结构,Go语言中的map是引用类型,必须初始化才能使用。
Go语言中map的定义语法如下:

  1. map[KeyType]ValueType

其中:

  • KeyType:表示键的类型
  • ValueType:表示键对应的值的类型

map类型的变量默认初始值为nil,需要使用make()函数来分配内存。语法为:

  1. make(map[KeyType]ValueType, [cap])

make:用于slice、map和channel的初始化
示例如下所示:

  1. // 方式1初始化
  2. var userInfo = make(map[string]string)
  3. userInfo["userName"] = "zhangsan"
  4. userInfo["age"] = "20"
  5. userInfo["sex"] = "男"
  6. fmt.Println(userInfo)
  7. fmt.Println(userInfo["userName"])
  1. // 创建方式2,map也支持声明的时候填充元素
  2. var userInfo2 = map[string]string {
  3. "username":"张三",
  4. "age":"21",
  5. "sex":"女",
  6. }
  7. fmt.Println(userInfo2)

二 . 遍历map

使用for range遍历

  1. // 遍历map
  2. for key, value := range userInfo2 {
  3. fmt.Println("key:", key, " value:", value)
  4. }

注意: 遍历map时的元素顺序与添加键值对的顺序无关。

也就是说,map无序 !

三 . 判断map中某个键值是否存在

我们在获取map的时候,会返回两个值,也可以是返回的结果,一个是是否有该元素

  1. // 判断是否存在,如果存在 ok = true,否则 ok = false
  2. value, ok := userInfo2["username2"]
  3. fmt.Println(value, ok)
  4. if ok {
  5. fmt.Println(v)
  6. } else {
  7. fmt.Println("查无此人")
  8. }

四 . 使用delete()函数删除键值对

使用delete()内建函数从map中删除一组键值对,delete函数的格式如下所示

  1. delete(map 对象, key)

其中:

  • map对象:表示要删除键值对的map对象
  • key:表示要删除的键值对的键

示例代码如下

  1. // 删除map数据里面的key,以及对应的值
  2. delete(userInfo2, "sex")
  3. fmt.Println(userInfo2)

五 . 元素为map类型的切片

我们想要在切片里面存放一系列用户的信息,这时候我们就可以定义一个元素为map类型的切片

  1. // 切片在中存放map
  2. var userInfoList = make([]map[string]string, 3, 3)
  3. var user = map[string]string{
  4. "userName": "张安",
  5. "age": "15",
  6. }
  7. var user2 = map[string]string{
  8. "userName": "张2",
  9. "age": "15",
  10. }
  11. var user3 = map[string]string{
  12. "userName": "张3",
  13. "age": "15",
  14. }
  15. userInfoList[0] = user
  16. userInfoList[1] = user2
  17. userInfoList[2] = user3
  18. fmt.Println(userInfoList)
  19. for _, item := range userInfoList {
  20. fmt.Println(item)
  21. }

六 . 值为切片类型的map

我们可以在map中存储切片

  1. // 将map类型的值
  2. var userinfo = make(map[string][]string)
  3. userinfo["hobby"] = []string {"吃饭", "睡觉", "敲代码"}
  4. fmt.Println(userinfo)

七 . 示例

统计字符串中单词出现的次数

  1. // 写一个程序,统计一个字符串中每个单词出现的次数。比如 "how do you do"
  2. var str = "how do you do"
  3. array := strings.Split(str, " ")
  4. fmt.Println(array)
  5. countMap := make(map[string]int)
  6. for _, item := range array {
  7. countMap[item]++
  8. }
  9. fmt.Println(countMap)

按照指定顺序遍历map

  1. func main() {
  2. rand.Seed(time.Now().UnixNano()) //初始化随机数种子
  3. var scoreMap = make(map[string]int, 200)
  4. for i := 0; i < 100; i++ {
  5. key := fmt.Sprintf("stu%02d", i) //生成stu开头的字符串
  6. value := rand.Intn(100) //生成0~99的随机整数
  7. scoreMap[key] = value
  8. }
  9. //取出map中的所有key存入切片keys
  10. var keys = make([]string, 0, 200)
  11. for key := range scoreMap {
  12. keys = append(keys, key)
  13. }
  14. //对切片进行排序
  15. sort.Strings(keys)
  16. //按照排序后的key遍历map
  17. for _, key := range keys {
  18. fmt.Println(key, scoreMap[key])
  19. }
  20. }