Go语言复合数据类型(3)-映射 – 21运维
通知: .-...

Go语言复合数据类型(3)-映射

GO 21运维 614浏览

映射
映射map是无序的键值对的集合。
(1)键必须唯一,键类型必须一致,值类型也必须相同。map通过key来检索数据。
(2)键类型必须支持 ==或者!= 比较操作运算符类型,值类型可以是任意数据类型。
(3)map是无序的,无法决定map的返回顺序。
(4)map的容量是可变的,所以make()创建的时候cap可以为空。

一,声明map
两种方式
1,传统声明
var 变量名 map[Key_type]Value_type

说明:
如果不初始化,就会创建一个nil map,这个nil map不能用来存放键值对。

2,短变量声明
变量名 := make(map[Key_type]Value_type)

ps:
不管采用哪种方式(短声明并初始化之外),都要使用到内建函数make()构建map,进行内存分配操作,否则就是一个空,无法直接赋值。

二,初始化map
同样两种方式
1,
变量名 =make( map[Key_type]Value_type)
变量名[key]= value
用make创建map类型。

后边访问某一个map元素,就可以直接通过 变量名[key] 进行输出即可。
2,
变量名=map[Key_type]Value_type{key1:value1,key2:value2} 多个key:value键值对用逗号隔开,类似json。

说明:
(1)短变量声明并初始化:
变量名 := make(map[Key_type]Value_type ) 等价于 变量名 := map[Key_type]Value_type{}
(2)初始化这个方法不唯一,根据个人习惯来操作就可以了。

package main

import "fmt"
func main(){
   var Mymap1  map[string]int
   Mymap1 = make(map[string]int)
   Mymap2 :=make(map[string]int)


   Mymap1["swh"] = 29
   Mymap2 = map[string]int{"swh":28,"cq":20,"xp":21}

   fmt.Println(Mymap1)
   fmt.Println(Mymap2)
}

输出结果:
map[swh:29]
map[cq:20 swh:28 xp:21]

三,遍历map
1,批量遍历
通过for range 变量名进行遍历map。 for range可以遍历数组、切片以及map,只是range遍历map会返回key以及value。

package main

import (
   "fmt"
)
func main(){
   //声明一个map映射类型变量
   var shenghuiCity map[string]string
   shenghuiCity = make(map[string]string)
   //采用短变量声明但不初始化
   //shenghuiCity := make(map[string]string)

   //对map元素进行赋值
   shenghuiCity["Sichuan"] = "Chengdu"
   shenghuiCity["Hubei"] = "Wuhan"
   shenghuiCity["Shanxi"] = "Xian"


   //采用短变量声明并初始化
   Person := map[string]int{
      "swh":30,
      "cq":26,
      "xp":20,
   }


   //输出整个map
   fmt.Println(Person)
   fmt.Println(shenghuiCity)

   //遍历整个映射,输出key和value
   fmt.Println("遍历整个映射shenghuiCity,输出key和value")
   for k,v := range shenghuiCity{
      fmt.Println(k,v)
   }

   //只遍历value,key用匿名变量
   fmt.Println("只遍历value,key用匿名变量")
   for _,v := range shenghuiCity{
      fmt.Println(v)
   }

   //只遍历key,只需要一个变量就可以,无需匿名变量。
   fmt.Println("只遍历key,只需要一个变量就可以,无需匿名变量;单独输出某一个map元素")
   for k := range shenghuiCity{
      fmt.Println(k)
      fmt.Println(shenghuiCity[k])
   }

}

输出结果:
map[cq:26 swh:30 xp:20]
map[Hubei:Wuhan Shanxi:Xian Sichuan:Chengdu]
遍历整个映射shenghuiCity,输出key和value
Sichuan Chengdu
Hubei Wuhan
Shanxi Xian
只遍历value,key用匿名变量
Xian
Chengdu
Wuhan
只遍历key,只需要一个变量就可以,无需匿名变量;单独输出某一个map元素
Sichuan
Chengdu
Hubei
Wuhan
Shanxi
Xian

说明:
(1)遍历整个map:

 for k,v  := range xxx{
    fmt.Println(k,v)
}

(2) 只遍历value,key需要用匿名变量:

 for _,v  := range xxx{
    fmt.Println(v)
}

(3)只遍历key,匿名变量都不用,简单粗暴:

 for k:= range xxx{
    fmt.Println(k)
}
2,检索某一个索引对应的值

格式:
xx_value,ok := map变量名[key]

说明:如果指定的key存在,则ok为true,同时值会赋值给xx_value 变量;否则为false。 一般会用ok作为判断。

package main

import "fmt"

func main(){
   devops := map[string]int{
      "swh":30,
      "cq":29,
      "xp":28,
   }
   fmt.Println(devops)

   for k := range devops{
      fmt.Println(k)
      fmt.Println(devops[k])
   }

   mouren,ok := devops["swh2"]
   if ok {
      fmt.Println("年龄是:",mouren)
   } else {
      fmt.Println("不存在")
   }
}

输出结果:
map[cq:29 swh:30 xp:28]
xp
28
swh
30
cq
29
true
年龄是: 30

3,删除map 键值对 元素
通过内建函数delete() 来实现。
格式:
delete(map,key)

案例:

package main

import "fmt"
func main(){
   Person := map[string]int{
      "swh":30,
      "cq":26,
      "xp":20,
   }
   fmt.Println(Person)
   delete(Person,"xp")
   fmt.Println(Person)
}

输出结果:
map[cq:26 swh:30 xp:20]
map[cq:26 swh:30]

转载请注明:21运维 » Go语言复合数据类型(3)-映射