0Pricing
Go Academy · 课时

映射内部机制

了解映射如何存储数据

映射内部机制 是 CoddyKit 上的免费 Go Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Go Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Go Academy 课程共包含 4 节课。

什么是映射

映射用于存储键值对。每个键对应一个值,平均而言查找速度非常快。

在 Go 中,您可以写成 map[KeyType]ValueType。

package main

import "fmt"

func main() {
	ages := map[string]int{"Ann": 30, "Bob": 25}
	fmt.Println(ages["Ann"])
}

底层的哈希表

Go 映射通过哈希表实现。哈希函数会将每个键转换为一个数字,该数字指向值所在的桶。

桶

映射会将条目存储在桶中。每个桶包含若干个键值对。键的哈希值决定它所属的桶,因此平均查找复杂度为 O(1)。

使用 make 创建

您可以使用 make 创建空映射,也可以选择性地提供大小提示,以预先分配空间。

package main

import "fmt"

func main() {
	scores := make(map[string]int)
	scores["x"] = 10
	fmt.Println(scores)
}

空值映射

声明但未初始化的映射是 nil。您可以从空值映射中读取数据(得到零值),但向其中写入会触发运行时恐慌。写入前请务必先初始化。

package main

import "fmt"

func main() {
	var m map[string]int
	fmt.Println(m == nil)
	fmt.Println(m["missing"])
}

添加和更新

为键赋值时,如果键是新的,就会添加该键;否则会覆盖已有的值。

package main

import "fmt"

func main() {
	m := map[string]int{"a": 1}
	m["b"] = 2
	m["a"] = 99
	fmt.Println(m)
}

删除键

内置函数 delete 会移除一个键。删除不存在的键是安全的,不会执行任何操作。

package main

import "fmt"

func main() {
	m := map[string]int{"a": 1, "b": 2}
	delete(m, "a")
	fmt.Println(m)
}

映射的长度

len 返回映射中当前键值对的数量。

package main

import "fmt"

func main() {
	m := map[string]int{"a": 1, "b": 2, "c": 3}
	fmt.Println(len(m))
}

映射会自动增长

随着您添加条目,Go 会扩大底层表,并可能将键重新哈希到新的桶中。这一过程会自动进行,因此您不必手动管理容量。

允许的键类型

键必须是可比较的:也就是可以与 == 一起使用的类型。字符串、数字、布尔值,以及字段类型都可比较的结构体都可以作为键。切片和映射不能作为键。

package main

import "fmt"

func main() {
	type Point struct{ X, Y int }
	m := map[Point]string{{1, 2}: "origin-ish"}
	fmt.Println(m[Point{1, 2}])
}

引用语义

映射值是对底层数据的引用。将映射传递给函数后,该函数可以修改同一个映射,无需使用指针。

package main

import "fmt"

func addOne(m map[string]int) {
	m["count"]++
}

func main() {
	m := map[string]int{"count": 0}
	addOne(m)
	fmt.Println(m)
}

快速检查

如果尝试向空值映射写入一个键,会发生什么?

回顾

映射的内部机制:

  • 映射是由桶组成的哈希表
  • 查找、插入和删除的平均复杂度为 O(1)
  • 键必须可比较;向空值映射写入会触发运行时恐慌
  • 映射具有引用语义

常见问题解答

「映射内部机制」课时是免费的吗?

是的 — 「映射内部机制」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Go Academy 课程的其余内容,请升级到 CoddyKit PRO。 Go Academy 课程共包含 4 节课。

「映射内部机制」这节课中我会学到什么?

了解映射如何存储数据 你通过在浏览器中直接运行的动手代码来练习 Go Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Go Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Go Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。

「映射内部机制」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Go Academy 课中编写并运行代码吗?

能。每节 Go Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 映射内部机制
  2. 检查是否存在
  3. 将映射用作集合
  4. 迭代与顺序
← 返回 Go Academy