目录
1.基本介绍
● map是key-value 数据结构,类似其它编程语言的集合
● 基本语法: var map 变量名 map[keytype]valuetype
○ key可以是很多种类型
■ 比如bool,数字,string,指针,channel,还可以是接口,结构体,数组.通常为int,string
■ 注意:slice,map还有function不可以,因为这几个没法用==来判断
○ valuetype的类型和key基本一样,通常为数字,string,map,struct
● map声明举例:
○ var a map[string]string
○ var a map[string]int
○ var a map[int]map[string]string
○ 注意:声明是不会分配内存的,初始化需要make,分配内存后才能赋值和使用
package main
import "fmt"
func main(){
var a map[string]string
a = make(map[string]string,10)
a["n1"]="张三"
a["n2"]="李四"
a["n3"]="王五"
a["n1"]="赵六"
fmt.Println(a)//map[n1:赵六 n2:李四 n3:王五]
}
● 对上述代码说明
○ map在使用前一定要make
○ map的key是不能重复的,如果重复了以最后这个kay-value为准
○ map的value是可以相同的
○ map的key-value是无序的
○ make内置函数
2.map的使用
方式一:先定义,再make,再赋值
var a map[string]string
a = make(map[string]string,10)
a["n1"]="张三"
a["n2"]="李四"
a["n3"]="王五"
a["n1"]="赵六"
fmt.Println(a)//map[n1:赵六 n2:李四 n3:王五]
方式二:定义直接make,再赋值
b := make(map[string]string)
b["n1"]="aaa"
b["n2"]="bbb"
fmt.Println(b)//map[n1:aaa n2:bbb]
方式三:直接赋值
c := map[string]string{
"n1" : "abc",
"n2" : "cba",
}
c["n3"]="qwe"
fmt.Println(c)//map[n1:abc n2:cba n3:qwe]
举例:
存放3个学生信息,每个学生有name和sex信息
思路:map[string]map[string]string
studentMap := make(map[string]map[string]string)
studentMap["stu01"] = make(map[string]string)
studentMap["stu01"]["name"] = "tom"
studentMap["stu01"]["sex"] = "男"
studentMap["stu02"] = make(map[string]string)
studentMap["stu02"]["name"] = "mary"
studentMap["stu02"]["sex"] = "女"
fmt.Println(studentMap)//map[stu01:map[name:tom sex:男] stu02:map[name:mary sex:女]]
fmt.Println(studentMap["stu01"])//map[name:tom sex:男]
fmt.Println(studentMap["stu01"]["name"])// tom
3.map的增删改查
-
map的增加和更新
○ map[“key”]=value
○ 如果key没有,就是增加,如果key存在就是修改 -
map删除
○ delete(map,“key”)
○ delete是一个内置函数,如果key存在就删除key-value,如果不存在不操作,也不会报错
○ 如果想要删除所有key,没有专门的方法一次清空,可以遍历删除key逐个删除或map=make(…),make一个新的,让原来的成为垃圾,被gc回收 -
map查找
b := make(map[string]string)
b["n1"]="aaa"
b["n2"]="bbb"
fmt.Println(b)//map[n1:aaa n2:bbb]
val,ok :=b["n2"]
if ok{
fmt.Println("有n2,值为:",val)//有n2,值为: bbb
}else{
fmt.Println("没有")
}
- map遍历
map遍历使用for-range
b := make(map[string]string)
b["n1"]="aaa"
b["n2"]="bbb"
for k,v:=range b{
fmt.Printf("k=%v v=%v",k,v)//k=n1 v=aaak=n2 v=bbb
}
studentMap := make(map[string]map[string]string)
studentMap["stu01"] = make(map[string]string)
studentMap["stu01"]["name"] = "tom"
studentMap["stu01"]["sex"] = "男"
studentMap["stu02"] = make(map[string]string)
studentMap["stu02"]["name"] = "mary"
studentMap["stu02"]["sex"] = "女"
for k1,v1 :=range studentMap{
fmt.Println("k1=",k1)
for k2,v2 :=range v1{
fmt.Printf("\t k2=%v v2=%v\n",k2,v2)
}
}
// k1= stu01
// k2=name v2=tom
// k2=sex v2=男
// k1= stu02
// k2=name v2=mary
// k2=sex v2=女
4.map的长度len
b := make(map[string]string)
b["n1"]="aaa"
b["n2"]="bbb"
fmt.Println(len(b))//2
5.map切片
切片的数据类型为map,成为map切片,这样map个数就可以动态变化了
package main
import(
"fmt"
)
func main(){
//声明一个切片
var stu []map[string]string
stu = make([]map[string]string,2)//准备存两个
//增加学生信息
if stu[0] == nil {
stu[0]=make(map[string]string,2)
stu[0]["name"] = "张三"
stu[0]["age"]="20"
}
if stu[1] == nil {
stu[1]=make(map[string]string,2)
stu[1]["name"] = "李四"
stu[1]["age"]="22"
}
//下面写法错误,报越界错误
// if stu[2] == nil {
// stu[2]=make(map[string]string,2)
// stu[2]["name"] = "王五"
// stu[2]["age"]="22"
// }
//需要使用切片的append函数,可以动态增加stu
newStu := map[string]string{
"name":"赵六",
"age" :"30",
}
stu =append(stu,newStu)
fmt.Println(stu)//[map[age:20 name:张三] map[age:22 name:李四] map[age:30 name:赵六]]
}
6.map排序
● golang中没有一个专门针对map的key进行排序
● golang中的map默认是无序的,每次遍历,得到的结果都不一样
● 方法:要排序,可以先将key排序,然后根据key遍历输出即可
package main
import (
"fmt"
"sort"
)
func main(){
map1 := make(map[int]int,10)
map1[10]=20
map1[1]=12
map1[2]=23
map1[3]=43
map1[4]=21
map1[5]=54
var keys []int
for k, _ :=range map1{
keys=append(keys,k)
}
sort.Ints(keys)
for _,k :=range keys{
fmt.Printf("map1[%v]=%v \n",k,map1[k])
}
// map1[1]=12
// map1[2]=23
// map1[3]=43
// map1[4]=21
// map1[5]=54
// map1[10]=20
}
7.map使用细节
● map是引用类型,遵守引用类型传值机制,在一个函数修改map后,会直接修改原来的map
● map的容量达到后,再想增加map元素,会自动扩容,并不会发生panic,也就是说map能动态的增长键值对
● map的value也经常使用struct类型
package main
import (
"fmt"
)
type Stu struct{
name string
age int
address string
}
func main(){
students := make(map[string]Stu,10)
stu1 := Stu{"tom",18,"北京"}
stu2 := Stu{"mary",20,"上海"}
students["no1"] = stu1
students["no2"] = stu2
fmt.Println(students)//map[no1:{tom 18 北京} no2:{mary 20 上海}]
}