golang中map的使用
在golang中声明一个map后,需要对map进行初始化操作,否则map中为nil(也就是其他语言中的null)时,无法对map进行赋值操作
在map中跟声明类型一样,有许多种声明方式,下面我们来一一展现出来
//声明方法1
var m1 map [int]string
m1 = map[int]string{}
//声明方法2
var m2 map [int]string
m2 = make(map[int]string)
//声明方法3
var m3 map[int]string = make(map[int]string)
//声明方法4
m3 := make(map[int]string)
在上面我们看到我们会对方法进行初始化操作,对于make()内置函数来说,在golang中只能应用与前面学到的slice,现在的map,和以后会用到的chan这三种类型,用于给这三种对象分配内存和初始化操作.
接下来,我们来使用map,初始化的map可以进行存入value,删除value等操作
m := make(map[int]string)
//存入键值
m[1] = "First Value"
a := m[1]
fmt.Println(m)
fmt.Println(a)
//删除键值
delete(m, 1)
a = m[1]
fmt.Println(m)
fmt.Println(a)
结果输出:
map[1:First Value]
First Value
map[]
golang中的map使用还是非常的方便的.
同样的我们还会遇到map的嵌套
比如:
var m map[int]map[int]string
m = make(map[int]map[int]string)
x, ok := m[1][1] //判断初始化是否完成
if !ok { //若未初始化,将map嵌套内的map初始化
m[1] = make(map[int]string)
}
m[1][1] = "Test Ok"
x, ok = m[1][1]
fmt.Println(x)
fmt.Println(m)
结果输出:
Test Ok
map[1:map[1:Test Ok]]
有兴趣的可以看看注释掉4-6行会发生什么。
map的迭代
//map迭代操作 k->键值对 v->值的拷贝
m := make([]map[int]string, 5)
for i := range m{
m[i] = make(map[int]string, 1)
m[i][1] = "ok"
fmt.Println(m[i])
}
fmt.Println(m)
结果输出:
map[1:ok]
map[1:ok]
map[1:ok]
map[1:ok]
map[1:ok]
[map[1:ok] map[1:ok] map[1:ok] map[1:ok] map[1:ok]]
注意的是,v是对键值的拷贝
map的排序
m := map[int]string{1 : "a", 2 : "b", 3 : "c", 4 : "d", 5 : "e"}
s := make([]int, len(m))
i := 0
for k, _ := range m{
s[i] = k
i++
}
sort.Ints(s)
fmt.Println(s)
注释掉第8行,我们多次输出后,会发现map的输出是无序的,当我们需要输出有序的map时,可以添加sort包来进行map的有序输出
多次运行输出结果:
map[1:a 2:b 3:c 4:d 5:e]
下面我们用所学到的map知识,对map中的key和value做一个交换的demo
m1 := map[int]string{1 : "a", 2 : "b", 3 : "c"}
m2 := make(map[string]int)
s1 := make([]int, len(m1))
s2 := make([]string, len(m1))
i := 0
for k, v := range m1{
s1[i] = k //int -> 1, 2, 3
s2[i] = v //string -> a, b, c
m2[v] = k
i++
}
//fmt.Printf("%v, %v\n",s1, s2)
sort.Ints(s1)
sort.Strings(s2)
fmt.Printf("%v\n",m1)
fmt.Printf("%v\n",m2)
程序输出:
map[1:a 2:b 3:c]
map[a:1 b:2 c:3]