映射
映射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) }
格式:
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)-映射