Go中的map

317 阅读2分钟

这是我参与8月更文挑战的第9天,活动详情查看:8月更文挑战

Map

map是一种引用类型

其中的每一条元素都由key和value组成, 是一种存储key:value的无序的集合

定义格式

var m map[keyType]valueType

keyType: 必须是可比较的类型, 如: int, float, string

valueType: 可以是任意类型. 可以将valueType声明为空接口类型interface{}, 这个value就可以存放任意值了

map的创建

声明一个map, 值为nil

 // 声明一个空map
 var m0 map[string]int
 ​
 // panic 当向一个nil的map中添加元素时, 会出现panic
 // m0["shaosiming"] = 18
 fmt.Printf("%#v \n", m0)

定义一个map, 初始化为空

 m1 := map[string]int {}
 ​
 // 这种map是可以添加数据的, 不会出现panic
 m1["tianming"] = 18
 fmt.Println(m1)

创建map时, 进行数据初始化

 // 在定义map时进行, 初始化数据
 var m2 = map[string]int{"shaosiming":18, "dashiming":20}
 fmt.Println(m2)

使用make创建map

 // 使用make创建一个map
 m3 := make(map[string]float64)
 ​
 // 这种空map也可以添加数据
 m3["ThreeBody"] = 88.8
 m3["EasyLove"] = 66.6
 fmt.Println("m3的长度: ", len(m3))
 fmt.Printf("%#v \n", m3)
 ​
 // 使用make创建一个map, 指定初始容量
 m4 := make(map[string]int, 10)
 fmt.Println("m4的长度: ", len(m4))
 fmt.Printf("%#v \n", m4)

注意: go中的map是一个引用类型, 当我们仅仅声明一个map时, 并未进行初始化, 指向nil, 当向这种map中添加数据时, 会引起panic, 我们可以用后三种方式来创建一个空的map

map的访问

直接通过key进行访问

 // 对于map的数据的访问
 m5 := make(map[string]string, 10)
 m5["shaosiming"] = "like blue buff"
 m5["dasiming"] = "like red buff"
 fmt.Println(m5["shaosiming"])
 fmt.Println(m5["dasiming"])
 ​
 // 判断map中的key是否存在
   /*
   如果key在map中, 则返回true, 否则返回false
   */
   v, ok := m5["shaosiming2"]
   if ok {
     fmt.Println(v)
   } else {
     fmt.Println("this key shaosiming no exist")
   }

通过range语句进行访问

 // 当用一个值接收数据时, 这个值为map中key
   for key := range m5 {
     fmt.Println("key: ", key, "value:", m5[key])
   }
 ​
   // 当用两个值接收数据时, 第一个值为key, 第二个值为value
   for key, value := range m5 {
     fmt.Println("key: ", key, "value:", value)
   }

更新map中的数据

 // 更新数据
 // 当map中没有这个key时则添加这条数据, 如果有这个key, 则更新map中的value
 m5["shaosiming"] = "daozhi"
 fmt.Println(m5)

删除map中的数据

 /*
 如果key存在, 则删除这条数据
 如果key不存在, 则不做操作
 */
 delete(m5, "shaosiming")

对map的顺序访问

 // 对map的顺序访问
 m6 := make(map[int]string, 5)
 m6[0] = "a"
 m6[1] = "b"
 m6[2] = "c"
 m6[3] = "d"
 m6[4] = "e"
 ​
 for k, v := range m6 {
    fmt.Println("key: ", k, "value: ", v)
 }
 fmt.Printf("%#v \n", m6)
 ​
 // 创建一个切片, 用来存储key
 var idxs []int
 for k := range m6 {
    idxs = append(idxs, k)
 }
 fmt.Println(idxs)
 ​
 // 将切片中的key进行排序
 sort.Ints(idxs)
 fmt.Println(idxs)
 ​
 // 再通过排序后的key, 来访问map, 就完成了顺序访问
 for _, idx := range idxs {
    fmt.Println("key: ", idx, "value: ", m6[idx])
 }