Golang map学习
在Go
语言中,map
是散列表的引用,map
的类型是map[K]V
,类似我们C++
的unordered_map
声明和初始化
// 给定名字得到年龄
ages := make(map[string]int)
// 创建并初始化(可以设置我们想要的值)
ages := map[string]int{
"alice": 31,
"charlie": 34,
}
不指定任何键值对,得到一个空map
ages := map[string]int{}
创建一个nil
的map
var ages map[string]int
这只是声明了一个map[string]int
类型的ages
,我们没有分配内存,这样我们是不能操作存储键值对的,必须要初始化后才可以,比如使用make
函数,为其开启一块可以存储数据的内存,也就是初始化。
实例代码
package main
import "fmt"
func main() {
// 初始化
ages := map[string]int{
"alice": 31,
"charlie": 34,
}
fmt.Println(ages) // map[alice:31 charlie:34]
ages["alice"] = 30 // 更改映射关系
ages["charlie"] = 30 // 更改映射关系
fmt.Println(ages) // map[alice:30 charlie:30]
// 使用内置函数delete移除元素
delete(ages, "alice")
fmt.Println(ages) // map[charlie:30]
}
遍历map
package main
import "fmt"
func main() {
// 初始化
ages := map[string]int{
"alice": 31,
"charlie": 34,
}
// 遍历散列表(得到两个返回值 key value)
for name, age := range ages {
fmt.Printf("%s\t%d\n", name, age)
}
// 忽略年龄
for name, _ := range ages {
fmt.Printf("%s\n", name)
}
}
alice 31
charlie 34
alice
charlie
map是引用类型的
查看如下代码
package main
import "fmt"
func resetMap(m map[string]int) {
m["上一周"] = 0
}
func main() {
m := map[string]int{
"上一周": 18,
"下一周": 20,
}
fmt.Println(m)
// 更改
resetMap(m)
fmt.Println(m)
}
map[上一周:18 下一周:20]
map[上一周:0 下一周:20]
我们创建了一个函数resetMap
并在其中更改map
的键值对,我们发现外部也发生了更改。这说明,map
在函数间传递并不是拷贝了一个副本的,在函数间改变也会影响函数外的map