映射内部机制
了解映射如何存储数据
映射内部机制 是 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 反馈 — 无需本地设置。