文章目录
- 声明初始化
- 概念
- 切片作为map的值
- 测试键值对存在和删除
- 数据的删除操作
- map类型的切片
声明初始化
概念
map是引用类型,可以使用下面进行声明
var map1 map[key]value
在进行声明的时候,不需要管map的长度,map是可以动态增长的
先来写一段基本的代码
func test1() {hash1 := make(map[string]int)hash1["cpp"] = 1hash1["java"] = 2hash1["php"] = 3fmt.Println(hash1)fmt.Println("key: cpp, value:", hash1["cpp"])
}
value的类型可以是很多类型,比如可以是一个函数,例如下面的代码:
func test2() {hash1 := map[int]func() int{1: func() int { return 10 },2: func() int { return 20 },3: func() int { return 30 },}fmt.Println(hash1[1]())fmt.Println(hash1[2]())
}
切片作为map的值
map的value可以是一个切片,如下所示
func test3() {hash1 := make(map[string][]int)hash1["cpp"] = append(hash1["cpp"], 2, 3, 4, 5)fmt.Println(hash1)
}
测试键值对存在和删除
看下面的代码:
func test4() {hash1 := make(map[string]int)hash1["cpp"] = 0fmt.Println(hash1["cpp"])fmt.Println(hash1["java"])
}
这样的代码存在这样的一个问题,到底是这个key对应的value本来就是0,还是因为这个key不存在导致是0?由于这样的问题,所以在进行获取元素前要先进行判断,再进行元素的获取
下面展示的逻辑是根据键值对进行对应数据的获取
func test5CheckExist(key string, hash1 map[string]int) {if value, ok := hash1[key]; ok {fmt.Println(value)} else {fmt.Println("不存在", key)}
}func test5() {hash1 := make(map[string]int)hash1["cpp"] = 0hash1["java"] = 1test5CheckExist("cpp", hash1)test5CheckExist("cpp1", hash1)
}
数据的删除操作
数据的删除操作如下
func test6() {hash1 := make(map[string]int)hash1["cpp"] = 1hash1["java"] = 1delete(hash1, "cpp")delete(hash1, "cpp1")if value, ok := hash1["cpp"]; ok {fmt.Println(value)} else {fmt.Println("not found")}
}
map类型的切片
现在有这样的场景,要获取一个map类型的切片,那么就需要使用两次make函数,第一次分配切片,第二次分配切片中的每一个map函数,具体例子如下
func test7() {s := make([]map[string]int, 5)for i := range s {s[i] = make(map[string]int)}
}