# 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章:項目實戰
- 結論
- 附錄