map
map的基本介绍
map是一种无序的基于key-value的数据结构,Go语言中的map是引用类型,必须初始化才能使用。
map的声明
1、基本语法
var 变量名 map[keytype]valuetype
说明:
- golang中的map的key可以是很多种类型,比如bool,string,指针,channel,整数,浮点数,还可以是包含前面几个类型的接口,结构体,数组。通常key为int,string。注意:slice,map还有function不可以,因为这几个没办法用==判断。
- valuetype的类型和key基本一样。通常为整数、浮点数,string,map,struct。
2、map声明举例
var a map[string]string
var a map[int]string
var a map[string]int
var a map[string]map[string]string
...
注意:声明是不会分配内存的,初始化需要make,分配内存后才能赋值和使用。
3、案例演示
package main
import(
"fmt"
)
func main(){
//map的声明和注意事项
var a map[string]string
//在使用map前,需要先make,make的作用就是给map分配数据空间
a = make(map[string]string,10)
a["no1"] = "Casey"
a["no2"] = "Jerry"
a["no3"] = "Jessical"
a["no1"] = "Huhuhu"
fmt.Println(a)
}
运行结果:
说明:
- map在使用前一定要make
- map的key是不能重复的,如果重复了,则以最后这个key-value为准。
- map的value可以相同的
- map的key-value是无序的
- make内置函数
map的使用
package main
import(
"fmt"
)
func main(){
//第一种使用方式
var a map[string]string
//在使用map前,需要先make,make的作用就是给map分配数据空间
a = make(map[string]string,10)
a["no1"] = "Casey"
a["no2"] = "Jerry"
a["no3"] = "Jessical"
a["no1"] = "Huhuhu"
fmt.Println(a)
//第二种使用方式
cities := make(map[string]string)
cities["c1"] = "北京"
cities["c2"] = "深圳"
cities["c3"] = "广州"
fmt.Println(cities)
//第三种使用方式
heroes := map[string]string{
"hero1" : "宋江",
"hero2" : "卢俊义",
"hero3" : "武松",
}
heroes["hero4"] = "林冲"
fmt.Println(heroes)
}
运行结果:
练习案例:
package main
import(
"fmt"
)
//案例
/*
演示一个key-value的value是map的案例
比如:我们要存放学生的信息,每个学生有name,sex信息
*/
func main(){
stuMap := make(map[string]map[string]string)
stuMap["stu1"] = make(map[string]string)
stuMap["stu1"]["name"] = "Casey"
stuMap["stu1"]["sex"] = "女"
stuMap["stu2"] = make(map[string]string)
stuMap["stu2"]["name"] = "Jerry"
stuMap["stu2"]["sex"] = "男"
fmt.Println(stuMap)
fmt.Println(stuMap["stu1"])
fmt.Println(stuMap["stu2"]["name"])
}
运行结果:
map的增删改查操作
1、map增加和更新
map[key] = value
如果key还没有,就是增加,如果key存在就是修改。
func main(){
var a map[string]string
a = make(map[string]string,10)
a["no1"] = "Casey"
a["no2"] = "Jerry"
a["no3"] = "Jessical"
a["no1"] = "Huhuhu"
fmt.Println(a)
}
2、map删除
delete(map,key),delete是一个内置函数,如果key存在,就删除该key-value,如果key不存在,不操作,但是也不会报错。
案例演示:
package main
import(
"fmt"
)
//案例
/*
演示一个key-value的value是map的案例
比如:我们要存放学生的信息,每个学生有name,sex信息
*/
func main(){
var a map[string]string
a = make(map[string]string,10)
a["no1"] = "Casey"
a["no2"] = "Jerry"
a["no3"] = "Jessical"
a["no1"] = "Huhuhu"
fmt.Println(a)
delete(a,"no1")
fmt.Println(a)
}
运行结果:
说明:
如果我们要删除map中的所有key,没有一个专门的方法一次删除,可以遍历一下key,逐个删除,或者map = make(…),make一个新的,让原来的成为垃圾,被gc回收。
3、map查找
val, key := a["no2"]
if key {
fmt.Printf("查找成功,值为%v\n",val)
}else{
fmt.Printf("没有找到...\n")
}
运行结果:
**说明:**如果a这个map中存在“no2”,那么就会返回true,否则返回false。
map遍历
map的遍历使用for-range的结构遍历。
package main
import(
"fmt"
)
func main(){
var a map[string]string
a = make(map[string]string,10)
a["no1"] = "Casey"
a["no2"] = "Jerry"
a["no3"] = "Jessical"
a["no1"] = "Huhuhu"
for key, value := range a{
fmt.Printf("k = %v,v = %v\n",key,value)
}
}
运行结果:
map使用细节
- map是引用类型,遵守应用类型传递的机制,在一个函数接收map,修改后,会直接修改原来的map
- map的容量达到后,再想增加元素,会自动扩容,并不会发生panic,也就是说map能动态的增长键值对(key-value)
将容量改为1后,程序仍可正常运行。
func main(){
var a map[string]string
//j将容量改为1
a = make(map[string]string,1)
a["no1"] = "Casey"
a["no2"] = "Jerry"
a["no3"] = "Jessical"
a["no1"] = "Huhuhu"
for key, value := range a{
fmt.Printf("k = %v,v = %v\n",key,value)
}
}
运行结果: