map的引入
- 映射(map),Go语言中内置的一种类型,它将键值相关联,我们可以通过键key来获取
对应的值value。类似其他语言的集合 - 基本语法 var map变量名 map[keytype] valuetype
key、value的类型:bool、数字、string、指针、channnel、还可以是只包含前面几个类型的接口、结构体、数组
key通常为int、string类型、value通通常为数字(整数、浮点数)、string、map、结构体
slice、map、function不可以
package main
import "fmt"
func main() {
//定义map变量
var a map[int]string
//只声明map内存是没有分配空间
//必须通过make函数进行初始化,才会分配空间:
a = make(map[int]string, 10) //map可以存放10个键值对
//将键值对存入map中
a[111] = "张三"
a[112] = "李四"
a[113] = "哇哈哈"
//输出集合
fmt.Println(a)
}
map的特点:
- map集合在使用前一定要make
- map的key-value是无序的
- key是不可以重复的,如果遇到重复,后一个value会替换前一个value
- value是可以重复的
- make函数的第二个函数size可以省略,默认就分配一个空间
map的三种创建方式
package main
import "fmt"
func main() {
//方式1
var a map[int]string
//只声明map内存是没有分配空间
//必须通过make函数进行初始化,才会分配空间:
a = make(map[int]string, 10) //map可以存放10个键值对
//将键值对存入map中
a[111] = "张三"
a[112] = "李四"
a[113] = "哇哈哈"
//输出集合
fmt.Println(a)
//方式2
b := make(map[int]string)
b[124] = "嘀嘀嘀"
b[125] = "大法师"
fmt.Println(b)
//方式3
c := map[int]string{
126: "类似匿名",
127: "高级",
}
c[128] = "张三"
fmt.Println(c)
}
map的操作
-
增加和更新操作:
map[“key”] = value ==> 如果key还没有,就是增加,如果key存在就是修改 -
删除操作:
delete(map, “key”), delete是一个内置函数,如果key存在,就删除该key-value,
如果k的v不存在,不操作,但是也不会报错 -
清空操作:
- 如果我们要删除map的所有key,没有一个专门的方法一次删除,可以遍历一下key,逐个删除
- 或者map = make(…),make一个新的,让原来的成为垃圾,被gc回收
-
查找操作
value, bol = map[key]
value为返回的value,bool为是否返回,要么true要么false
package main
import "fmt"
func main() {
//定义map
b := make(map[int]string)
//增加
b[123] = "张三"
b[256] = "李斯"
//修改
b[123] = "赵六"
//删除
delete(b, 123)
delete(b, 233)
fmt.Println(b)
//查找
value, flag := b[200]
fmt.Println(value)
fmt.Println(flag)
}
- 获取长度
- 遍历 for-range
package main
import "fmt"
func main() {
b := make(map[int]string)
//增加
b[110] = "张三"
b[120] = "李斯"
b[130] = "你好评"
//获取长度
fmt.Println(len(b))
//遍历:
for k, v := range b {
fmt.Printf("key为:%v value为%v \t", k, v)
}
fmt.Println("------------------------")
//加深难度
a := make(map[string]map[int]string)
a["班级1"] = make(map[int]string, 3)
a["班级1"][12] = "张三"
a["班级1"][13] = "菲菲"
a["班级1"][15] = "haha"
a["班级2"] = make(map[int]string, 3)
a["班级2"][122] = "雄安"
a["班级2"][133] = "发发"
a["班级2"][154] = "阿发"
for k1, v1 := range a {
fmt.Println(k1)
for k2, v2 := range v1 {
fmt.Printf("学生学号为:%v 学生姓名为%v \t", k2, v2)
}
fmt.Println()
}
}