1.简介
map是key-value数据结构,右丞为字段或者关联数据。类似其他语言的集合,map在go中是引用类型,必须初始化才能使用。
2.语法
map[keytype]valuetype
keytype:表示间的类型。可以是基本数据类型,还可以是指针、channl等。注意slice、map还有function是可用的,没办法用==来判断。常用 string ,int。
valuetype:表示key对应的值。
3.map的初始化
3.1方式一
在使用前,需要先make,make的作用就是给map分配数据空间
var dog map[string]string
dog = make(map[string]string)
dog["color"] = "red"
dog["name"] = "dahuang"
fmt.Println(dog)
结果:
map[color:red name:dahuang]
3.2方式二
userinfo := make(map[string]string)
userinfo["name"] = "zhansan"
userinfo["height"] = "1.98"
fmt.Println(userinfo)
结果:
map[height:1.98 name:zhansan]
3.3方式三
在声明的时候直接填充数据
person := map[string]string{
"name": "松江",
"height": "1.89",
}
fmt.Println(person)
结果:
map[height:1.89 name:松江]
4.map的增删改查
4.1map的增加
var dog map[string]string
dog = make(map[string]string)
dog["color"] = "red"
dog["name"] = "dahuang"
4.2map的查找
var dog map[string]string
dog = make(map[string]string)
dog["color"] = "red"
dog["name"] = "dahuang"
fmt.Println(dog["color"])
value, ok := dog["name1"]
if ok {
fmt.Println(value)
} else {
fmt.Println("不存在")
}
说明:如果dog这个map存在name1,那么ok就等于true,否则返回false。
结果:
red
不存在
4.3map的修改
var dog map[string]string
dog = make(map[string]string)
dog["color"] = "red"
dog["name"] = "dahuang"
dog["color"] = "pink"
fmt.Println(dog["color"])
说明 :dog["color"] = "pink" //如果有color这个key,就修改,没有就增加。
结果:
pink
4.4.map的删除
var dog map[string]string
dog = make(map[string]string)
dog["color"] = "red"
dog["name"] = "dahuang"
delete(dog, "color")
fmt.Println(dog)
说明:delete(dog, "color"),delete是一个内置函数,如果key存在,就删除该key-value,如果不存在,不操作,也不会报错。
如果要删除map的所有key,没有一个专门的方法一次删除,可以遍历删除,或者map=make()一个新的,让原来的成为垃圾,被gc回收。
结果:
map[name:dahuang]
5.map的遍历
person := map[string]string{
"name1": "松江",
"name2": "武松",
}
结果:
key:name1 value:松江
key:name2 value:武松
6.map切片的使用
var listUser = make([]map[string]string, 2, 2)
listUser[0] = make(map[string]string)
listUser[0]["no"] = "1"
listUser[0]["name"] = "zhangsan"
listUser[1] = make(map[string]string)
listUser[1]["no"] = "2"
listUser[1]["name"] = "wangwu"
fmt.Println(listUser)
for _, value := range listUser {
for key, mvalue := range value {
fmt.Println(key, mvalue)
}
}
结果:
no 1
name zhangsan
no 2
name wangwu
7.使用细节
7.1map是引用类型,遵守引用类型传递的机制,在一个函数接受map,修改后,会直接修改原来的map。
7.2map的荣狼打倒后,在想map增加元素,会自动扩容,并不会发生panic,也就是说map能动态增长。
7.3map的value也常用struct类型,更适合管理复杂的数据。
8.练习提
计算字符串abcdergabchsdjfhfshkfh中各个字幕出现的次数。
var str = "abcdergabchsdjfhfshkfh"
slice := []byte(str) //转成切片,再用string(slice[i])转换成字母
maptotal := make(map[string]int)
for _, value := range slice {
_, ok := maptotal[string(value)]
if ok {
maptotal[string(value)] = maptotal[string(value)] + 1
} else {
maptotal[string(value)] = 1
}
}
fmt.Println(maptotal)
结果:
map[a:2 b:2 c:2 d:2 e:1 f:3 g:1 h:4 j:1 k:1 r:1 s:2]