map的使用

package main

import (
   "fmt"
   "sort"
)

func main() {
   // 创建map变量(方式一),格式:map[keyType]valueType,其中keyType为key的数据类型,valueType为value的数据类型
   var profile = make(map[string]string) // 等价于:var profile map[string]string = make(map[string]string)
   profile["name"] = "张三"
   profile["age"] = "18"
   profile["gender"] = "男"

   // 创建map变量(方式二)
   // var profile = map[string]string{
   //     "name":   "张三",
   //     "age":    "18",
   //     "gender": "男",
   // }

   // 创建map变量(方式三)
   // var profile = map[string]string{}
   // profile["name"] = "张三"
   // profile["age"] = "18"
   // profile["gender"] = "男"

   fmt.Println("profile =", profile) // profile = map[age:18 gender:男 name:张三]

   // 遍历map(重要提醒:map是无序的,每次执行程序操作输出的三个属性的先后顺序可能是不同的)
   for key, value := range profile {
      fmt.Printf("%v => %v \n", key, value)
   }
   // gender => 男
   // name => 张三
   // age => 18

   // 根据key值排序然后遍历map(重要提醒:Go只提供了value值排序函数,故只能提取出所有key然后对其排序再遍历所有key变相实现按key值排序)
   keys := make([]string, 0)
   for key := range profile {
      keys = append(keys, key)
   }
   fmt.Println("排序前的keys =", keys) // 排序前的keys = [name age gender]
   sort.Strings(keys)
   fmt.Println("排序后的keys =", keys) // 排序后的keys = [age gender name]
   for _, key := range keys {
      fmt.Printf("%v => %v \n", key, profile[key])
   }
   // age => 18
   // gender => 男
   // name => 张三

   // 检查key是否存在(测试不存在的情况)
   value, exist := profile["job"]
   if exist {
      fmt.Println("job存在,其值为:", value)
   } else {
      fmt.Println("job不存在") // job不存在
   }

   // 检查key是否存在(测试存在的情况)
   value, exist = profile["name"]
   if exist {
      fmt.Println("name存在,其值为:", value) // name存在,其值为: 张三
   } else {
      fmt.Println("name不存在")
   }

   // 删除key(重要提醒:若key不存在并不会报错)
   delete(profile, "gender")
   fmt.Println("profile =", profile) // profile = map[age:18 name:张三]
}

// ========== 总结 ========== //
// 1、map就是一张key=value哈希表,所以在一个map里面key是唯一的。值得一提的是key的数据类型不仅可以是int、string,还可以
//    是bool、指针,甚至是接口、结构体、数组,但不能是slice、map、function。
// 2、map是无序的,它不会根据key值来排序,也不会根据key插入或修改时间来排序(注:使用Print打印map时会根据key升序,但map本
//    身仍然是无序的)。

package main

import "fmt"

func main() {
   // 如果value值的数据类型不确定可以设为any,这里的any类似Java里的Object
   profile1 := make(map[string]any)
   profile1["name"] = "张三"
   profile1["age"] = 18
   profile1["gender"] = "男"
   profile1["weight"] = 66.5
   fmt.Println("profile1 =", profile1) // profile1 = map[age:18 gender:男 name:张三 weight:66.5]

   // 如果key和value的数据类型都不确定可以都设为any
   profile2 := map[any]any{
      "name":   "李四",
      "age":    17,
      "gender": "女",
      "weight": 52.8,
   }
   fmt.Println("profile2 =", profile2) // profile2 = map[age:17 gender:女 name:李四 weight:52.8]
}

package main

import "fmt"

func main() {
   // 只声明且没有赋值的map变量值为nil,或者是map变量的零值为nil
   var map1 map[string]any
   if map1 == nil {
      fmt.Println("map1 == nil") // map1 == nil
   } else {
      fmt.Println("map1 != nil")
   }

   // 被赋值的map变量值不为nil,即使是空map
   var map2 = map[string]any{}
   if map2 == nil {
      fmt.Println("map2 == nil")
   } else {
      fmt.Println("map2 != nil") // map2 != nil
   }

   // 重置map变量为nil
   map2 = nil
   if map2 == nil {
      fmt.Println("map2 == nil") // map2 == nil
   } else {
      fmt.Println("map2 != nil")
   }
}

Copyright © 2024 码农人生. All Rights Reserved