映射将键映射到值。
映射的零值为 nil 。nil 映射既没有键,也不能添加键。
make 函数会返回给定类型的映射,并将其初始化备用。
1 package main 2 3 4 import "fmt" 5 6 7 type Vertex struct { 8 Lat, Long float64 9 } 10 11 12 var m map[string]Vertex 13 14 15 func main() { 16 m = make(map[string]Vertex) 17 m["Bell Labs"] = Vertex{ 18 40.68433, -74.39967, 19 } 20 fmt.Println(m["Bell Labs"]) 21 }
映射的文法与结构体相似,不过必须有键名。
1 package main 2 3 4 import "fmt" 5 6 7 type Vertex struct { 8 Lat, Long float64 9 } 10 11 12 var m = map[string]Vertex{ 13 "Bell Labs": Vertex{ 14 40.68433, -74.39967, 15 }, 16 "Google": Vertex{ 17 37.42202, -122.08408, 18 }, 19 } 20 21 22 func main() { 23 fmt.Println(m) 24 }
若顶级类型只是一个类型名,你可以在文法的元素中省略它。
1 package main 2 3 4 import "fmt" 5 6 7 type Vertex struct { 8 Lat, Long float64 9 } 10 11 12 var m = map[string]Vertex{ 13 "Bell Labs": {40.68433, -74.39967}, 14 "Google": {37.42202, -122.08408}, 15 } 16 17 18 func main() { 19 fmt.Println(m) 20 }
修改映射
在映射 m 中插入或修改元素:
- m[key] = elem
获取元素:
- elem = m[key]
删除元素:
- delete(m, key)
通过双赋值检测某个键是否存在:
- elem, ok = m[key]
若 key 在 m 中,ok 为 true ;否则,ok 为 false。
若 key 不在映射中,那么 elem 是该映射元素类型的零值。
同样的,当从映射中读取某个不存在的键时,结果是映射的元素类型的零值。
注 :若 elem 或 ok 还未声明,你可以使用短变量声明:
elem, ok := m[key]
1 package main 2 3 4 import "fmt" 5 6 7 func main() { 8 m := make(map[string]int) 9 10 11 m["Answer"] = 42 12 fmt.Println("The value:", m["Answer"]) 13 14 15 m["Answer"] = 48 16 fmt.Println("The value:", m["Answer"]) 17 18 19 delete(m, "Answer")//试试把它注释掉就会下面得到v,ok结果为48,true 20 fmt.Println("The value:", m["Answer"]) 21 22 23 v, ok := m["Answer"] 24 fmt.Println("The value:", v, "Present?", ok) 25 }
练习:映射(在练习的网址里)
实现 WordCount。它应当返回一个映射,其中包含字符串 s 中每个“单词”的个数。函数 wc.Test 会对此函数执行一系列测试用例,并输出成功还是失败。
你会发现 strings.Fields 很有帮助。
1 package main 2 3 4 import ( 5 "fmt" 6 "strings" 7 ) 8 9 10 func wordCount(s string) map[string]int{ 11 ret := make(map[string]int) 12 arr := strings.Fields(s) 13 fmt.Println(arr) 14 15 16 for _,val := range arr{ 17 ret[val]++ 18 } 19 return ret 20 } 21 22 23 func main() { 24 fmt.Println(wordCount("I ate a donut. Then I ate another donut.")) 25 }
浙公网安备 33010602011771号