前言
Map中,存储的是键值对,且键值对是无序的。
Map中,对值的操作不是使用下标,而是使用键。
Map长度是不固定的。但是同样可以使用len()获取Map的长度,获取的长度是key的数量或者说是键值对的数量。
语法
使用变量申明或者使用make直接创建
//创建出来一个nil的map,无法直接使用。
var map_name map[key_type]value_type
//初始化map
map_name = make(map[key_type]value_type)
如果map没有初始化,那么他就是一个nil的map(引用类型的空就是nil),nil的map无法使用,无法插入数据。
声明+初始化
var map_name = make(map[key_type]value_type)
mapname := make(map[key_type]value_type)
声明+初始化+赋值
map_name := map[key_type]value_type {key1:v1, key2:v2, ...}
Map操作-增删改查
创建map&新改查key
func main() {
var map1 = make(map[string]int)
map1["GO"] = 11
map1["Python"] = 12
map1["JAVA"] = 13
fmt.Println(map1)
fmt.Println(map1["GO"])
fmt.Println(map1["java"])
//修改key的值
map1["Python"] = 14
fmt.Println(map1)
}
新增key和修改key的值的语法是一致的,map_name[key] = value
查key可以直接使用map_name[key],获取key的值。
示例中,如果key不存在,则获取的值就是默认空值。int类型默认0,string类型默认” “。所以”java”key的值是0。
判断key是否为空
前面说到key如哦不存在,则值为默认空值。但是也有可能key的值就是0。那么如何判断key是否为空呢?
func main() {
var map1 = make(map[string]int)
map1["GO"] = 11
v1, ok := map1["java"]
if ok {
fmt.Println("key的值:", v1)
} else {
fmt.Println("not found")
}
v2, ok := map1["GO"]
if ok {
fmt.Println("key的值:", v2)
} else {
fmt.Println("not found")
}
}
获取key的值时,会返回两个值。示例中v是key的值,ok是布尔类型,表示key是否存在。
删除key
语法
delete(map_name, key)
Map遍历
因为Map没有下标,所以没有办法通过操作下标去遍历Map。但是可以用for range。
对于Map,for range获取到的是key和对应的value。
func main() {
var map1 = make(map[string]int)
map1["GO"] = 11
map1["JAVA"] = 12
map1["Python"] = 13
for key, value := range map1 {
fmt.Println("map1的key和value:", key, value)
}
}
通过多次运行for range遍历Map,不难发现每次输出的key的顺序都不一样。印证了Map是无序的。
Map和Slice的配合使用
使用Slice对Map进行排序
虽然Map是无序的,但是可以结合slice和sort包实现排序的效果。使用slice存储Map的key;使用sort包对slice进行排序。这样就可以从slice获取有序的key,使用key从Map获取对应value。
func main() {
var map1 = make(map[string]int)
map1["A"] = 11
map1["B"] = 12
map1["C"] = 13
map1["D"] = 14
map1["E"] = 15
//遍历Map,将key append到切片中
slice1 := []string{}
for key, _ := range map1 {
slice1 = append(slice1, key)
}
fmt.Println("排序前的slice1:", slice1)
//对切片进行排序
sort.Strings(slice1)
fmt.Println("排序后的slice1:", slice1)
//遍历排序后的slice1,获取Map[key]
fmt.Println("---遍历Map---")
for _, key := range slice1 {
fmt.Println(key, map1[key])
}
}
Map存入Slice
func main() {
map1 := map[string]int{
"A": 1,
"B": 2,
}
map2 := map[string]int{
"C": 1,
"D": 2,
}
slice1 := []map[string]int{map1}
slice1 = append(slice1, map2)
for _, value := range slice1 {
fmt.Println(value)
}
}
for range遍历slice,获取的value就是map
版权声明:本文为qq522044637原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。