Go语言编程基础 结构体、切片与映射(五)(完结)——映射、函数值、闭包

释放双眼,带上耳机,听听看~!

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

学习源:Go 指南

给TA打赏
共{{data.count}}人
人已打赏
安全技术

C/C++预处理指令#define,#ifdef,#ifndef,#endif…

2022-1-11 12:36:11

安全运维

Linux下安装Redis

2021-12-11 11:36:11

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索