go语言基础学习(map)
map介绍
map是key-value的数据结构,又称为字段或者关联数组,类似其他编程语言的集合
基本语法
var map变量名 map[keytype] valueType
key可以是什么类型?
golang中的map,key可以是多种类型的。比如bool,int,string,指针,channel,还可以是包含前面几个类型的接口,结构体、数组。通常为int,string 注意:slice,map中还有function不可以,因为这几个没法用==来判断 map声明的案例:
var a map[string]string
var a map[string] int
var a map[int]string
var a map[int] map[int] string
func main() {
var a map[string]string
//a["num1"] = "111" //panic: assignment to entry in nil map
// 在使用前需要先make,分配空间
a = make(map[string]string, 10)
a["n1"] = "测试"
fmt.Println(a)
}
注意:声明是不会分配内存的,初始化需要make,分配内存后才能赋值和使用
map的使用
三种使用方式
func main() {
var a map[string]string
//a["num1"] = "111" //panic: assignment to entry in nil map
// 在使用前需要先make,分配空间
a = make(map[string]string, 10)
a["n1"] = "测试"
fmt.Println(a)
//第二种
cities := make(map[string]string)
cities["n01"] = "背景"
cities["n02"] = "上海"
fmt.Println(cities)
//第三种
heroes := map[string]string{
"hero1": "孙悟空",
"hero2": "唐增",
}
fmt.Println(heroes)
}
map的增删改查操作
cities := make(map[string]string)
cities["n01"] = "背景"
cities["n02"] = "上海"
cities["n03"] = "天津"
fmt.Println(cities)
//修改操作
cities["n03"] = "广州"
fmt.Println(cities)
//删除
delete(cities, "n01")
fmt.Println(cities)
//指定的key不存在
delete(cities, "n04")
fmt.Println(cities)
//查询
val, ok := cities["n02"]
if ok {
fmt.Println(val)
} else {
fmt.Println("没有n01对应的key")
}
//如果希望一次性删除所有的key
//1. 遍历所有的key,然后逐一删除[遍历]
//2.直接make新的空间
cities = make(map[string]string)
fmt.Println(cities)
map的遍历
map的遍历使用for-range的结构进行遍历的
func main() {
cities := make(map[string]string)
cities["n01"] = "背景"
cities["n02"] = "上海"
cities["n03"] = "天津"
for k, v := range cities {
fmt.Printf("k=%s and v=%s\n", k, v)
}
}
map切片
切片的数据类型如果是map,就是map切片,map的个数可以动态的变化
func main() {
//声明一个map切片
var monsters []map[string]string
monsters = make([]map[string]string, 2)
//增加信息
if monsters[0] == nil {
monsters[0] = make(map[string]string, 2)
monsters[0]["name"] = "牛魔王"
monsters[0]["age"] = "35"
}
if monsters[1] == nil {
monsters[1] = make(map[string]string, 2)
monsters[1]["name"] = "红孩儿"
monsters[1]["age"] = "15"
}
//切片的append函数,可以动态的增加元素
monsterNew := map[string]string{
"name": "玉兔精",
"age": "12",
}
monsters = append(monsters, monsterNew)
fmt.Println(monsters)
}
输出:
map的排序
1)golang中没有一个专门的方法对map的key进行排序 2)golang中的map默认是无序的,注意也不是按照添加的顺序排序的,每次遍历得到的输出可能不一样 3)golang中的map排序,是先将key进行排序,然后根据key的值,遍历输出即可
*说明:这一部分排序的功能,不同版本的go是不一样的。1.18版本是支持的。 *
func main() {
//map的排序
map1 := make(map[int]int, 10)
map1[10] = 100
map1[1] = 12
map1[2] = 8
map1[3] = 19
map1[4] = 1
fmt.Println(map1)
//如何按照map的key的顺序进行排序输出
//1.先将map的key放入到切片中
//2.对切片进行排序
//3.遍历切片,然后按照key的值输出map
var keys []int
keys = make([]int, len(map1))
for k, _ := range map1 {
keys = append(keys, k)
}
//排序
sort.Ints(keys)
fmt.Println(keys)
for _, k := range keys {
fmt.Println(map1[k])
}
}
输出:
map的使用细节:
1) map是引用类型,遵循引用类型传递的机制,在一个函数接口map,修改后会直接修改原来的map
2) map的容量达到后,再想map增加元素,会自动扩容,并不会发生panic,也就是说map可以动态的增长键值对
3)map的value也经常使用struct类型,更适合管理复杂的数据