什么是 map?

Map 是 Go 中的内置类型,它将键与值绑定到一块儿。能够经过键获取相应的值。golang

如何建立 map?
makemake(map[KeyType]ValueType)map[KeyType]ValueType
personSalary := make(map[string]int)
personSalary
make
package main

import (  
    "fmt"
)

func main() {  
    var personSalary map[string]int
    if personSalary == nil {
        fmt.Println("map is nil. Going to make one.")
        personSalary = make(map[string]int)
    }
}
personSalarymakemap is nil. Going to make one.
向 map 中插入元素
personSalary
package main

import (  
    "fmt"
)

func main() {  
    personSalary := make(map[string]int)
    personSalary["steve"] = 12000
    personSalary["jamie"] = 15000
    personSalary["mike"] = 9000
    fmt.Println("personSalary map contents:", personSalary)
}
personSalary map contents: map[steve:12000 jamie:15000 mike:9000]

也能够在声明时初始化一个数组:spa

package main

import (  
    "fmt"
)

func main() {  
    personSalary := map[string]int {
        "steve": 12000,
        "jamie": 15000,
    }
    personSalary["mike"] = 9000
    fmt.Println("personSalary map contents:", personSalary)
}
personSalary"mike"
personSalary map contents: map[steve:12000 jamie:15000 mike:9000] 
string
访问 map 中的元素
map[key]
package main

import (  
    "fmt"
)

func main() {  
    personSalary := map[string]int{
        "steve": 12000,
        "jamie": 15000,
    }
    personSalary["mike"] = 9000
    employee := "jamie"
    fmt.Println("Salary of", employee, "is", personSalary[employee])
}
jamieSalary of jamie is 15000
personSalary
package main

import (  
    "fmt"
)

func main() {  
    personSalary := map[string]int{
        "steve": 12000,
        "jamie": 15000,
    }
    personSalary["mike"] = 9000
    employee := "jamie"
    fmt.Println("Salary of", employee, "is", personSalary[employee])
    fmt.Println("Salary of joe is", personSalary["joe"])
}

上面的程序输出为:

Salary of jamie is 15000  
Salary of joe is 0  
joejoepersonSalary

咱们如何检测一个键是否存在于一个 map 中呢?可使用下面的语法:

value, ok := map[key]  
okok
package main

import (  
    "fmt"
)

func main() {  
    personSalary := map[string]int{
        "steve": 12000,
        "jamie": 15000,
    }
    personSalary["mike"] = 9000
    newEmp := "joe"
    value, ok := personSalary[newEmp]
    if ok == true {
        fmt.Println("Salary of", newEmp, "is", value)
    } else {
        fmt.Println(newEmp,"not found")
    }

}
okjoe
joe not found  

range for 可用于遍历 map 中全部的元素(译者注:这里 range 操做符会返回 map 的键和值)。

package main

import (  
    "fmt"
)

func main() {  
    personSalary := map[string]int{
        "steve": 12000,
        "jamie": 15000,
    }
    personSalary["mike"] = 9000
    fmt.Println("All items of a map")
    for key, value := range personSalary {
        fmt.Printf("personSalary[%s] = %d\n", key, value)
    }

}

上面的程序输出以下:

All items of a map  
personSalary[mike] = 9000  
personSalary[steve] = 12000  
personSalary[jamie] = 15000

值得注意的是,由于 map 是无序的,所以对于程序的每次执行,不能保证使用 range for 遍历 map 的顺序老是一致的。

删除元素
delete(map, key)delete
package main

import (  
    "fmt"
)

func main() {  
    personSalary := map[string]int{
        "steve": 12000,
        "jamie": 15000,
    }
    personSalary["mike"] = 9000
    fmt.Println("map before deletion", personSalary)
    delete(personSalary, "steve")
    fmt.Println("map after deletion", personSalary)

}
steve
map before deletion map[steve:12000 jamie:15000 mike:9000]  
map after deletion map[mike:9000 jamie:15000] 
map 的大小

用内置函数 len 获取 map 的大小:

package main

import (  
    "fmt"
)

func main() {  
    personSalary := map[string]int{
        "steve": 12000,
        "jamie": 15000,
    }
    personSalary["mike"] = 9000
    fmt.Println("length is", len(personSalary))

}
len(personSalary)personSalarylength is 3
map 是引用类型

与切片同样,map 是引用类型。当一个 map 赋值给一个新的变量,它们都指向同一个内部数据结构。所以改变其中一个也会反映到另外一个:

package main

import (  
    "fmt"
)

func main() {  
    personSalary := map[string]int{
        "steve": 12000,
        "jamie": 15000,
    }
    personSalary["mike"] = 9000
    fmt.Println("Original person salary", personSalary)
    newPersonSalary := personSalary
    newPersonSalary["mike"] = 18000
    fmt.Println("Person salary changed", personSalary)
}
personSalarynewPersonSalarynewPersonSalarymike18000personSalarymike18000
Original person salary map[steve:12000 jamie:15000 mike:9000]  
Person salary changed map[jamie:15000 mike:18000 steve:12000]  

将 map 做为参数传递给函数也是同样的。在函数中对 map 的任何修改都会影响在调用函数中看到。