0. 前言
map 这种结构,在很多语言中都会存在,他的作用也是非常大的,map是key-value数据结构,又称为字段或者关联数组。golang的map是hashmap,是使用数组+链表的形式实现的,使用拉链法消除hash冲突。
golang中的map,的key可以是很多种类型,比如booL,数字,string,指针,channel,还可以是只包含前面几个类型的接口,结构体,数组通常key为int、string
注意:slice,map还有function不可以,因为这几个没法用=来判断
1. 声明
- var a mapstring]string
- var a map[string]int
- var a map[int]string
- var a map[string]map[string]string
声明是不会分配内存的,初始化需要make,分配内存后才能赋值和使用。
package main
import (
"fmt"
)
func main(){
var a map[string]string
a make(map[string]string,10)
a["no1"]="宋江"
a["no2"]="吴用"
a["no1"]="武松”
a["no3"]="吴用"
fmt.Println(a)
}
- map在使用前一定要make
- map的key是不能重复,如果重复了,则以最后这个key-value为准
- map的value是可以相同的,
- map的key-value是无序
- make内置函数数目
2. 使用
增加和更新
map["key"] = value // 如果key还没有,就是增加,如果key存在就是修改。
func main(){
cities :make(map[string]string)
cities["no1"]="北京
cities["no2]="天津"
cities["no3]="上海
fmt.Println(cities)
// 因为no3这个key已经存在,因此下面的这句话就是修改
cities["no3]"上海~"
fmt.Println(cities)
}
删除
delete(map,"key")
delete是一个内置函数,如果key存在,就删除该key-value,如果key不存在,不操作,但是也不会报错
func main(){
delete(cities,"nol")
fmt.Println(cities)
//当delete指定的key不存在时,剔除不会操作,也不会报错
delete(cities,"no4")
fmt.Println(cities)
}
注意:如果我们要删除map的所有key,没有一个专门的方法一次删除,可以遍历一下key,逐个删除或者map=make(),make一个新的,让原来的成为垃圾,被gc回收
查找
func main(){
val,ok :cities["no2"]
if ok
fmt.Printf("有no1key值为%wn',val)
else
fmt.Printf("设有no1key叭n)
}
如果heroes这个map中存在"nol",那么findRes就会返回true,否则返回false
3. 遍历
map的遍历很简单,遍历map时的元素顺序与添加键值对的顺序无关。在使用map前,需要先定义make,make的作用就是给map分配空间。map是引用类型,遵守引用类型传递的机制,在一个函数接收map,修改后会直接修改原来的map。map的容 量达到后,再想map增加元素,会自动扩容,并不会发生panic也就是说map能动态的增长键值对(key-value)。map的value 也经常使用struct类型,更适合管理复杂的数据。
案例
package main
import (
"fmt"
)
func main(){
cities :make(map[string]string)
cities["no1"]="北京"
cities["no2"]="天津
cities["no3"]="上海”
for k,v:=range cities{
fmt.Printf("k=%vv=%v\n",k,v)
}
studentMap :make(map[string]map[string]string)
studentMap["stue1"] = make(map[string]string,3)
studentMap["stue1"]["name" ]= "tom'
studentMap["stuo1"]["sex"j = "男”
studentMap[”stuo1"]["address"] = "北京长安街~"
studentMap[”stuo2"] = make(map[string]string,3)
studentMap["stu02"]["name"] = "mary"
studentMap["stu02"]["sex"] = "女"
studentMap["stuo2"]["address"]="上海黄浦江"
for k1,11 :range studentMap{
fmt.Println("k1=",k1)
for k2,v2 :range v1{
fmt.Printf("\t k2=%v v2=%v\n",k2,v2)
}
fmt.Println()
}
}
本文正在参加技术专题18期-聊聊Go语言框架