# 3.3 映射
go语言中的映射在其他语言中叫字典或哈希表。正如你想象的:你可以定义一个键和值,然后可以从映射中获取、设置和删除这个值。
和切片一样,映射也是可以通过`make`创建。让我们看看下面这个例子:
```go
func main() {
lookup := make(map[string]int)
lookup["goku"] = 9001
power, exists := lookup["vegeta"]
// 打印:0和false
// 0代表一个整数型的默认值
fmt.Println(power, exists)
}
```
使用`len`可以获得映射中键的个数。使用`delete`可以删除映射中的一个键值对。
```go
// 返回 1
total := len(lookup)
// 没有返回值, 可以调用一个不存在的键
delete(lookup, "goku")
```
映射是动态增长的。然后,我们也可以在使用`make`时传递第二个参数设置映射的初始大小:
`lookup := make(map[string]int, 100)`
如果你能知道你的映射有多少个键,定义时指定一个初始大小可以获得一定的性能提升。
当你希望将一个映射作为一个结构体的字段时,你可以这样定义:
```go
type Saiyan struct {
Name string
Friends map[string]*Saiyan
}
```
初始化上面定义的结构体的一种方式:
```go
goku := &Saiyan{
Name: "Goku",
Friends: make(map[string]*Saiyan),
}
goku.Friends["krillin"] = ... //可以创建Krillin
```
这里还有提供了另外一种方式去定义并初始化一个映射。类似`make`,这种方式是针对映射和数组。我们可以声明一个复合文字:
```go
lookup := map[string]int{
"goku": 9001,
"gohan": 2044,
}
```
在`for`循环中,使用`range`关键字也可以遍历一个映射:
```go
for key, value := range lookup {
...
}
```
需要注意的是,编译映射并不是有序的。每次遍历映射时,返回的键值对都是随机的顺序。
## 链接
- 关于本书
- 引言
- 准备工作
- 安装开发环境
- 开始使用Go
- 创建一个Go模块
- 第1章:基础知识
- 1.1 编译
- 1.2 静态类型
- 1.3 类c语法
- 1.4 垃圾回收
- 1.5 运行go代码
- 1.6 导入包
- 1.7 变量和声明
- 1.8 函数声明
- 1.9 继续之前
- 第2章:语法学习
- 2.1 声明和初始化
- 2.2 结构体上的函数
- 2.3 构造函数
- 2.4 new
- 2.5 结构体字段
- 2.6 组合
- 2.7 指针类型和值类型
- 2.8 继续之前
- 第3章:复杂类型
- 3.1 数组
- 3.2 切片
- 3.3 映射
- 3.4 指针类型和值类型
- 3.5 继续之前
- 第4章:面向对象
- 4.1 包
- 4.2 接口
- 4.3 继续之前
- 第5章:综合知识
- 5.1 错误处理
- 5.2 defer
- 5.3 go语言风格
- 5.4 初始化的if
- 5.5 空接口和转换
- 5.6 字符串和字节数组
- 5.7 函数类型
- 5.8 内存分配
- 第6章:高并发
- 6.1 go协程
- 6.2 同步
- 6.3 通道
- 6.4 继续之前
- 第7章:工具库
- 7.1 类型转换
- 7.2 时间操作
- 第8章:程序测试
- 单元测试
- 性能测试
- 第9章:简单实例
- 内存分配
- 第10章:项目实战
- 结论
- 附录