练习
学完本章你应该掌握
- 能根据场景区分数组、切片、map,并写出对应的定义、初始化和基础操作代码。
- 能完成数组和切片的索引、截取、追加、排序,并正确使用
len、cap、append。 - 能正确初始化 map,完成增删改查,并使用
value, ok := m[key]判断键是否存在。 - 能识别并修正常见错误,例如数组长度不匹配、切片直接越界赋值、
append后漏接收返回值、向 nil map 写入数据。 - 能把本章知识迁移到基础数据整理场景,例如成绩统计、名称排序、字符数统计和有序输出。
简单
第 1 题:声明并修改一个数组
编写一个 Go 程序,完成下面要求:
- 声明一个
scores数组,类型为[4]int - 初始值分别是
88、76、95、60 - 把第二个元素改成
80 - 依次输出第一个元素、第二个元素和整个数组
查看参考答案
| |
输出结果:
| |
第 2 题:补全自动推导长度的数组
补全下面代码中的两个空白,让程序输出:
| |
| |
查看参考答案
补全后的代码如下:
| |
说明:
...可以让 Go 自动推导数组长度。len(langs)-1是最后一个元素的索引。
第 3 题:创建并追加一个切片
编写一个程序,完成下面要求:
- 使用
make([]string, 0, 3)创建切片topics - 依次追加
"Go"、"切片"、"练习" - 输出切片内容
- 再输出它的长度和容量
示例输出可以类似这样:
| |
查看参考答案
| |
第 4 题:写出 make 和 append 的结果
阅读下面代码,写出它的输出结果:
| |
查看参考答案
| |
说明:make([]int, 2, 5) 创建的是长度为 2、容量为 5 的切片;追加一个元素后,长度变成 3,容量仍然是 5。
第 5 题:修正 nil map 的写入错误
下面程序有问题,请改正后让它正常运行,并保持原有输出逻辑不变:
| |
查看参考答案
修正后的代码:
| |
输出结果:
| |
说明:map 在写入前必须先初始化;读取不存在的键时,会返回零值和 false。
一般
第 6 题:用数组统计三门成绩
编写一个程序,完成下面要求:
- 提示用户按“成绩1 成绩2 成绩3”的格式输入 3 个整数,例如
80 90 85 - 使用数组
[3]int保存这 3 个成绩 - 使用
for range计算总分 - 输出总分和平均分,平均分保留 1 位小数
示例输出可以类似这样:
| |
查看参考答案
| |
说明:这道题把数组、输入、遍历和类型转换组合到了一起,是很典型的基础整合题。
第 7 题:对整数切片分别做升序和降序排序
编写一个程序,完成下面要求:
- 创建切片
nums := []int{34, 12, 56, 23} - 先输出原始切片
- 再把它按升序排序后输出
- 最后把它按降序排序后输出
查看参考答案
| |
一种可能的输出结果:
| |
说明:sort.Ints 用来做升序排序;sort.Reverse 可以把排序结果反过来,得到降序。
第 8 题:建立并查询一张年龄表
编写一个程序,完成下面要求:
- 创建一个
map[string]int - 写入三条数据:
"阿斌":18、"小李":20、"小王":19 - 删除
"小李" - 分别读取
"阿斌"和"小李"的年龄 - 两次读取都要使用
value, ok := m[key] - 最后输出两次读取的结果
示例输出可以类似这样:
| |
查看参考答案
| |
说明:这道题把 map 的初始化、写入、删除和 ok 判断放到了一起,是 map 最常见的一组操作。
进阶
下面两题会把数组、切片、map 放到更接近真实数据整理的场景里,重点考察多个知识点的配合使用。
第 9 题:统计字符串的字节数和字符数
编写一个程序,完成下面要求:
- 读取一个不含空格的字符串,例如
Go语言123 - 输出它的字节数
- 再输出它的字符数
示例输出可以类似这样:
| |
查看参考答案
| |
说明:
len(text)统计的是字节数。len([]rune(text))统计的是字符个数,处理中英文混合内容时更常用。
第 10 题:按固定顺序输出成绩并统计平均分
已知有一份成绩表:
| |
现在要求你按下面这个顺序输出成绩:
| |
请编写程序,完成下面要求:
- 按
names的顺序输出每个人的成绩 - 在输出过程中累计总分
- 最后输出总分和平均分,平均分保留 1 位小数
示例输出可以类似这样:
| |
查看参考答案
| |
说明:map 的遍历顺序不固定,所以如果你需要稳定顺序,常见做法是先准备一个切片,再按切片顺序去 map 里取值。