# 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 { ... } ``` 需要注意的是,编译映射并不是有序的。每次遍历映射时,返回的键值对都是随机的顺序。 ## 链接