17 映射
映射将键映射到值。
映射的零值为nil。nil映射既没有键,也不能添加键。
make函数会返回给定类型的映射,并将其初始化备用。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 1package main
2
3import "fmt"
4
5func main() {
6 var m map[string]int
7 m = make(map[string]int)
8 m["kk"] = 12
9 m["gg"] = 11
10 fmt.Println(m["kk"])
11 fmt.Println(m)
12 fmt.Printf("%T\n", m)
13}
14
15
18 映射的文法
映射的文法与结构体类似,不过必须有键名。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 1package main
2import "fmt"
3
4type vvv struct {
5 lll, ll float64
6}
7
8var m = map[string]vvv{
9 "www":vvv{
10 12.3,13.4,
11 },
12 "ppp":vvv{
13 22.5, 33.7,
14 },
15}
16
17func main() {
18 fmt.Println(m)
19}
20
21
若顶级类型只是一个类型名,可以在文法元素中省略。
19 修改映射
在映射m中插入或修改元素:
1
2
3 1m[key] = elem
2
3
获取元素:
1
2
3 1elem = m[key]
2
3
删除元素:
1
2
3 1delete(m, key)
2
3
通过双赋值检测某个键是否存在:
1
2
3 1elem, ok = m[key]
2
3
若key在m中,ok为true;否则,ok为false。
若key不在映射中,那么elem是该映射元素类型的零值。
当从映射中读取某个不存在的键时,结果为映射元素类型的零值。
若:elem或ok未声明,可以使用短变量声明:
1
2
3 1elem, ok := m[key]
2
3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 1package main
2
3import "fmt"
4
5func main() {
6 m := make(map[string]int)
7
8 m["aaa"] = 42
9 fmt.Println("The value:", m["aaa"])
10
11 m["aaa"] = 48
12 fmt.Println("The value:", m["aaa"])
13
14 delete(m, "aaa")
15 fmt.Println("The value:", m["aaa"])
16
17 v, ok := m["aaa"]
18 fmt.Println("The value:", v, "Present?", ok)
19}
20
21
20 函数值
函数也是值,可以如同其他值一样传递。
函数值可以用作函数的参数或返回值。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 1package main
2
3import "fmt"
4
5func kkk(i func()){
6 fmt.Println("kkkk")
7 i()
8}
9
10func main() {
11 fff := func() { fmt.Println("fff") }
12 kkk(fff)
13}
14
15
21 函数的闭包
Go函数可以为闭包。闭包是一个函数值,它引用了函数体之外的变量。该函数可以访问并赋予其引用的变量的值,即,该函数被“绑定”在了这些变量上。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 1package main
2
3import "fmt"
4
5func main() {
6 count := 0
7 ff := func() {
8 fmt.Println(count)
9 }
10 for i := 0; i < 10; i ++ {
11 count++
12 ff()
13 }
14}
15
16