映射将键映射到值。
映射的零值为 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 }

 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
posted on 2022-08-02 17:37  Jolyne123  阅读(66)  评论(0)    收藏  举报