长安链 DAPP 开发必学 Go 05

159 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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 的用法,咱们下一章见~