golang中map学习
哈希表
哈希表是一个无序的key/value对的集合,其中所有的key都是不同的,然后通过给定的key可以在常数时间复杂度内检索、更新或删除对应的value;
golang中的map
在Go语言中,一个map就是一个哈希表的引用,map类型可以写为map[K]V,其中K和V分别对应key和value。map中所有的key都有相同的类型,所有的value也有着相同的类型,但是key和value之间可以是不同的数据类型。
- 在向map中插入数据之前,必须要创建一个map,下面是两种常见的方法
1
2
3
|
mp:=make(map[string]int)
mp["liming"]=12
mp["xiaoming"]=21
|
1
2
3
4
|
mp:=map[string]int{
"liming":12
"xiaoming":21
}
|
-
map中的元素并不是一个变量,对map不能进行取址;并可能随着元素的增加,会改变地址容纳更多的元素;
-
Map的迭代顺序是不确定的,并且不同的哈希函数实现可能导致不同的遍历顺序。在实践中,遍历的顺序是随机的,每一次遍历的顺序都不相同;
-
map不能直接进行相等比较,唯一例外的是和nil进行比较;判断两个map是否含有相同的key,value;可以通过一个循环来实现;
-
下面这种语句要理解,在这种场景下,map的下标语法将产生两个值;第二个是一个布尔值,用于报告元素是否真的存在。布尔变量一般命名为ok,特别适合马上用于if条件判断部分;
if age, ok := ages["bob"]; !ok { /* ... */ }
-
上面的3,4可用下面的代码进行验证:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
package main
import "fmt"
func listMap(a map[string]int){
for k,v :=range a{
fmt.Println(k,v)
}
}
func equal (a,b map[string]int) bool{
if len(a)!=len(b){
return false
}
for k,av :=range a{
if bv,ok:=b[k];!ok||av!=bv{
return false
}
}
return true
}
func main() {
a:=map[string]int{
"liming":12,
"stanni":18,
"monica":22,
"zhangqiamg":55,
}
b:=map[string]int{
"liming":12,
"stanni":18,
"monica":22,
"zhangqiamg":55,
}
listMap(a)
listMap(b)
fmt.Println(equal(a,b))
}
|
golang中对map进行排序
golang的map是无序的,不管是按照 key 还是value 默认都不排序, 如果要为 map 排序,需要将 key 拷贝到一个切片,对切片排序,然后使用切片的 for-range 方法打印出map中所有的 key 和 value。例如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
package main
import "fmt"
// func listmap(mp map[string]int) {
// for k, v := range mp {
// fmt.Println(k, v)
// }
// }
func main() {
mp := map[string]int{
"lq": 9,
"xw": 10,
"mm": 8,
}
// listmap(mp)
s := []string{}
for k := range mp {
s = append(s, k)
}
for _, n := range s {
fmt.Println(n, mp[n])
}
}
|