map 是在 Go 中将值(value)与键(key)关联的内置类型。通过相应的键可以获取到值
1:创建Map
语法:make(map[type of key]type of value)
testMap := make(map[string]int)
map 的零值是 nil。如果你想添加元素到 nil map 中,map 必须使用 make 函数初始化
package main
import (
"fmt"
)
func main() {
var testMap map[string]int
if testMap == nil {
testMap = make(map[string]int)
}
}
2:map元素的增加,获取,删除
给 map 添加新元素的语法和数组相同
package main
import (
"fmt"
)
func main() {
testMap := make(map[string]int)
testMap["a1"] = 12000
testMap["a2"] = 15000
testMap["a3"] = 9000
fmt.Println("testMap map contents:", testMap)
}
上面的程序输出:
testMap map contents: map[a1:12000 a2:15000 a3:9000]
你也可以在声明的时候初始化 map。
package main
import (
"fmt"
)
func main() {
testMap := map[string]int {
"a1": 12000,
"a2": 15000,
}
testMap["a3"] = 9000
fmt.Println("testMap map contents:", testMap)
}
输出:
testMap map contents: map[a1:12000 a2:15000 a3:9000]
键不一定只能是 string 类型。所有可比较的类型,如 boolean,interger,float,complex,string 等,都可以作为键
目前我们已经给 map 添加了几个元素,现在学习下如何获取它们。获取 map 元素的语法是 map[key]
package main
import (
"fmt"
)
func main() {
testMap := map[string]int {
"a1": 12000,
"a2": 15000,
}
testMap["a3"] = 9000
vauleKey := "a2"
fmt.Println("vaule of", vauleKey, "is", testMap[vauleKey])
}
输出
vaule of a2 is 15000
如果获取一个不存在的元素,会发生什么呢?map 会返回该元素类型的零值
package main
import (
"fmt"
)
func main() {
testMap := map[string]int {
"a1": 12000,
"a2": 15000,
}
testMap["a3"] = 9000
vauleKey := "a2"
fmt.Println("vaule of", vauleKey, "is", testMap[vauleKey])
fmt.Println("vaule of", "a4", "is", testMap[a4])
}
输出:
vaule of a2 is 15000
vaule of a2 is 0
如果我们想知道 map 中到底是不是存在这个 key,该怎么做:
value, ok := map[key]
package main
import (
"fmt"
)
func main() {
testMap := map[string]int {
"a1": 12000,
"a2": 15000,
}
testMap["a3"] = 9000
newEmp := "a4"
value, ok := testMap[newEmp]
if ok == true {
fmt.Println("value of", newEmp, "is", value)
} else {
fmt.Println(newEmp,"not found")
}
}
输出:
a4 not found
遍历 map 中所有的元素需要用 for range 循环
package main
import (
"fmt"
)
func main() {
testMap := map[string]int {
"a1": 12000,
"a2": 15000,
}
testMap["a3"] = 9000
fmt.Println("All items of a map")
for key, value := range testMap {
fmt.Printf("testMap[%s] = %d\n", key, value)
}
}
如何删除map中的一个元素?
删除 map 中 key 的语法是 delete(map, key)。这个函数没有返回值。
package main
import (
"fmt"
)
func main() {
testMap := map[string]int {
"a1": 12000,
"a2": 15000,
}
testMap["a3"] = 9000
fmt.Println("map before deletion", testMap)
delete(personSalary, "a3")
fmt.Println("map after deletion", testMap)
}
输出:
map before deletion map[a1:12000 a2:15000 a3:9000]
map after deletion map[a1:9000 a2:15000]
3:map的长度
获取 map 的长度使用 len 函数。
package main
import (
"fmt"
)
func main() {
testMap := map[string]int {
"a1": 12000,
"a2": 15000,
}
testMap["a3"] = 9000
fmt.Println("length is", len(testMap))//输出:length is 3
}
4:map是引用类型
和 slices 类似,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)
}
上面程序中,personSalary 被赋值给 newPersonSalary。下一行 ,newPersonSalary 中 mike 的薪资变成了 18000 。personSalary 中 Mike 的薪资也会变成 18000。程序输出
Original person salary map[steve:12000 jamie:15000 mike:9000]
Person salary changed map[steve:12000 jamie:15000 mike:18000]
5:map的比较
判断两个 map 是否相等的方法是遍历比较两个 map 中的每个元素