开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第19天,点击查看活动详情
本文已参与「开源摘星计划」,欢迎正在阅读的你加入。活动链接:github.com/weopenproje…
上一章,介绍完了切片 slice 的打手小弟们。这一章,请出下一位数据结构中大哥大级别的任务——哈希表 map。
它在数据结构中正式的名字是 HashTable,翻译过来叫“散列表”、“哈希表”。在 Python 中它叫做“字典” dict,在 Java 中它叫做 HashMap(八股文整起来),而在 go 中,它叫做 map。
要特别强调下,为啥哈希表这么重要。哈希表的一个重要的特性就是用“空间换时间”,这在当今互联网“分秒必争”且硬件设备越来越先进、越来越便宜的当下,在业务应用中稳稳拿下C位。
这里从命名上做下展开。我们都知道,哈希表实现的功能就是存储“键值对”,通过一个“键”,通常是字符串或者数字,找到它对应的“值”。而它实现的方式,就是利用哈希函数来计算下标,用一个数组来保存数据。
显然,从具体实现的角度看,它的确是一张“表”(Table)。而从具体的功能上看,它更像是个“字典” dict。而 map 这个词,大眼一看以为是“地图”的意思,让人困惑。后来,我细想了一下,这里的 map 应该是取得“映射”(mapping)的意思。哈哈,这样就说的通了。
怎样取个形象又准确的名字,在计算机界也是个很有趣的话题。
好,言归正传,我们来看下 go 语言中 map 的用法,先是怎么初始化:
package main
import "fmt"
type Vertex struct { // 定义一个 Vertex 结构体
Lat, Long float64
}
var m map[string]Vertex // 定义一个“键”为 string 类型,“值” 为 Vertex的 map
func main() {
m = make(map[string]Vertex) // 使用构造函数 make 来初始化
m["Bell Labs"] = Vertex{ // 赋值
40.68433, -74.39967,
}
fmt.Println(m["Bell Labs"])
}
记住,go 是静态编译型语言,所以
map的类型要提前声明好。
package main
import "fmt"
type Vertex struct {
Lat, Long float64
}
var m = map[string]Vertex{ // 可以直接用花括号初始化 map 值
"Bell Labs": Vertex{
40.68433, -74.39967,
},
"Google": Vertex{
37.42202, -122.08408,
},
}
func main() {
fmt.Println(m)
}
关于 map 的“增删改查”(CURD):
package main
import "fmt"
func main() {
m := make(map[string]int)
m["Answer"] = 42 // 增加一个键值对
fmt.Println("The value:", m["Answer"])
m["Answer"] = 48 // 修改一个键值对
fmt.Println("The value:", m["Answer"])
delete(m, "Answer") // 删除一个键值对
fmt.Println("The value:", m["Answer"])
v, ok := m["Answer"] // 查找一个键值对
fmt.Println("The value:", v, "Present?", ok)
}
ok,以上就是 go 语言中 map 的用法,咱们下一章见~