这是我参与「第三届青训营 -后端场」笔记创作活动的第4篇笔记。
一、认识Map(定义、创建、查看、获取Map的长度)
可以看作是HashMap
map是Go中的内置类型,它将一个值与一个键关联起来。可以使用相应的键检索值。
Map 是一种无序的键值对的集合。Map 最重要的一点是通过 key 来快速检索数据,key 类似于索引,指向数据的值 Map 是一种集合,所以我们可以像迭代数组和切片那样迭代它。不过,Map 是无序的,我们无法决定它的返回顺序,这是因为 Map 是使用 hash 表来实现的,也是引用类型
注意点:
1、map是无序的,每次打印出来的map都会不一样,它不能通过index获取,而必须通过key获取
2、map的长度是不固定的,也就是和slice一样,也是一种引用类型
3、内置的len函数同样适用于map,返回map拥有的key的数量
4、map的key可以是所有可比较的类型,如布尔型、整数型、浮点型、复杂型、字符串型……也可以键。
定义、创建、查看、获取Map的长度
import (
"fmt"
"testing"
)
func Test_08_01(t *testing.T) {
//1、定义Map
var countryCapitalMap map[string]string //默认定义类型为nil,相当于null
//创建集合:必须要进行创建才能够添加key、value键值对
countryCapitalMap = make(map[string]string)
countryCapitalMap["France"] = "Paris"
countryCapitalMap["Italy"] = "Rome"
countryCapitalMap["Japan"] = "Tokyo"
countryCapitalMap["India"] = "New Delhi"
//2、使用key来输出map
for key, value := range countryCapitalMap {
fmt.Println("key:",key,",values:",value)
}
//3、查看map中是否存在元素
captial, exists := countryCapitalMap["France"] //这里返回两个值,前者是对应取到的value;后者为true或false,表示是否取到
if !exists {
//若是不存在
fmt.Println("United States is not a city")
}
//若是存在
fmt.Println(captial) // Paris
//4、获取map的长度
fmt.Println("map的长度:", len(countryCapitalMap)) //map的长度: 4
}
二、map的删除
delete(map, key) :函数用于删除集合的元素, 参数为 map 和其对应的 key。删除函数不返回任何值。
/**
二、map删除:delete(map, key)
*/
func Test_08_02(t *testing.T) {
var myMap map[string]string = make(map[string]string)
myMap["a"] = "a"
myMap["b"] = "b"
myMap["c"] = "c"
fmt.Println(myMap) //map[a:a b:b c:c]
//删除key为a的map,没有返回值
delete(myMap, "a")
fmt.Println(myMap) //map[b:b c:c]
}
三、ok-idiom
语法格式:value, ok := map[key],前者是获取到的value,后者表示是否获取到。
/**
三、ok-idiom:通过取key,来获取到value以及是否取到
*/
func Test_08_03(t *testing.T) {
m := make(map[string]string)
m["a"] = "a"
result,ok := m["a"]
fmt.Println(result) //a
fmt.Println(ok) //true
}
四、map是引用类型
/**
四、Map引用类型:引用赋值给其他引用,对赋值后的引用修改实际上也会修改源map
*/
func Test_08_04(t *testing.T) {
myMap := make(map[string]string)
myMap["a"] = "a"
myMap["b"] = "b"
myMap["c"] = "c"
//进行引用
myMap2 := myMap
myMap2["a"] = "aaa"
fmt.Println(myMap2) //map[a:aaa b:b c:c]
fmt.Println(myMap) //map[a:aaa b:b c:c]
//可以来进行判断是否为null
var myMap3 map[string]string
if myMap3 == nil {
fmt.Println("666")
}
//666
}
注意:map不能使用==操作符进行比较。==只能用来检查map是否为空。否则会报错:invalid operation: map1 == map2 (map can only be comparedto nil)。