这是我参与8月更文挑战的第9天,活动详情查看:8月更文挑战
Map
map是一种引用类型
其中的每一条元素都由key和value组成, 是一种存储key:value的无序的集合
定义格式
var m map[keyType]valueType
keyType: 必须是可比较的类型, 如: int, float, string
valueType: 可以是任意类型. 可以将valueType声明为空接口类型interface{}, 这个value就可以存放任意值了
map的创建
声明一个map, 值为nil
// 声明一个空map
var m0 map[string]int
// panic 当向一个nil的map中添加元素时, 会出现panic
// m0["shaosiming"] = 18
fmt.Printf("%#v \n", m0)
定义一个map, 初始化为空
m1 := map[string]int {}
// 这种map是可以添加数据的, 不会出现panic
m1["tianming"] = 18
fmt.Println(m1)
创建map时, 进行数据初始化
// 在定义map时进行, 初始化数据
var m2 = map[string]int{"shaosiming":18, "dashiming":20}
fmt.Println(m2)
使用make创建map
// 使用make创建一个map
m3 := make(map[string]float64)
// 这种空map也可以添加数据
m3["ThreeBody"] = 88.8
m3["EasyLove"] = 66.6
fmt.Println("m3的长度: ", len(m3))
fmt.Printf("%#v \n", m3)
// 使用make创建一个map, 指定初始容量
m4 := make(map[string]int, 10)
fmt.Println("m4的长度: ", len(m4))
fmt.Printf("%#v \n", m4)
注意: go中的map是一个引用类型, 当我们仅仅声明一个map时, 并未进行初始化, 指向nil, 当向这种map中添加数据时, 会引起panic, 我们可以用后三种方式来创建一个空的map
map的访问
直接通过key进行访问
// 对于map的数据的访问
m5 := make(map[string]string, 10)
m5["shaosiming"] = "like blue buff"
m5["dasiming"] = "like red buff"
fmt.Println(m5["shaosiming"])
fmt.Println(m5["dasiming"])
// 判断map中的key是否存在
/*
如果key在map中, 则返回true, 否则返回false
*/
v, ok := m5["shaosiming2"]
if ok {
fmt.Println(v)
} else {
fmt.Println("this key shaosiming no exist")
}
通过range语句进行访问
// 当用一个值接收数据时, 这个值为map中key
for key := range m5 {
fmt.Println("key: ", key, "value:", m5[key])
}
// 当用两个值接收数据时, 第一个值为key, 第二个值为value
for key, value := range m5 {
fmt.Println("key: ", key, "value:", value)
}
更新map中的数据
// 更新数据
// 当map中没有这个key时则添加这条数据, 如果有这个key, 则更新map中的value
m5["shaosiming"] = "daozhi"
fmt.Println(m5)
删除map中的数据
/*
如果key存在, 则删除这条数据
如果key不存在, 则不做操作
*/
delete(m5, "shaosiming")
对map的顺序访问
// 对map的顺序访问
m6 := make(map[int]string, 5)
m6[0] = "a"
m6[1] = "b"
m6[2] = "c"
m6[3] = "d"
m6[4] = "e"
for k, v := range m6 {
fmt.Println("key: ", k, "value: ", v)
}
fmt.Printf("%#v \n", m6)
// 创建一个切片, 用来存储key
var idxs []int
for k := range m6 {
idxs = append(idxs, k)
}
fmt.Println(idxs)
// 将切片中的key进行排序
sort.Ints(idxs)
fmt.Println(idxs)
// 再通过排序后的key, 来访问map, 就完成了顺序访问
for _, idx := range idxs {
fmt.Println("key: ", idx, "value: ", m6[idx])
}