练习
学完本章你应该掌握
- 能使用
var和:=完成基础变量声明,并理解零值、全局变量、局部变量的区别。 - 能根据场景选择
fmt.Print、fmt.Println、fmt.Printf,写出普通输出和格式化输出。 - 能使用
fmt.Scan、fmt.Scanln读取一个或多个输入值,并知道为什么要传变量地址。 - 能识别并修正常见输入输出错误,例如占位符类型不匹配、读取时漏写
&、把:=用在函数外。 - 能把本章的输入输出知识迁移到稍复杂一点的控制台交互场景,例如整行读取、输入转换、简单输入校验。
简单
第 1 题:声明并输出三个变量
编写一个 Go 程序,完成下面要求:
- 声明
name、age、city三个变量。 - 至少使用一次
var,至少使用一次:=。 - 把这三个变量分别输出到控制台,每个值占一行。
查看参考答案
| |
第 2 题:观察变量的零值
声明下面三个变量,但先不要赋值:
score intnickname stringpassed bool
然后把它们输出出来,观察默认值分别是什么。
扩展思考:既然字符串内容直接输出时不明显,怎么做才能输出 " " 呢?
查看参考答案
| |
输出结果:
| |
说明:第二行是空字符串,所以看起来像“空了一行”。
扩展写法,可以把下面代码放到 main 函数里继续观察:
| |
输出结果:
| |
说明:len 可以查看字符串长度。空字符串 "" 的长度是 0,空格字符串 " " 的长度是 1。如果只是 fmt.Print(" ") 或 fmt.Println(" "),控制台确实会输出一个空格,但肉眼很难看出来;用 %q 或给它加上 [] 这样的边界,就能明显看出它存在。
第 3 题:写出下面程序的输出结果
阅读下面代码,写出它的输出结果:
| |
查看参考答案
| |
说明:前两个 Print 不换行,Println 会在末尾补一个换行。
第 4 题:补全 Printf 的占位符
已知下面三个变量:
| |
请补全这一行代码中的占位符,让成绩保留 1 位小数:
| |
查看参考答案
| |
说明:
%s输出字符串%d输出整数%.1f输出浮点数并保留 1 位小数
一般
第 5 题:读取一个姓名并输出欢迎语
编写一个程序:
- 提示用户输入姓名
- 使用
fmt.Scanln读取一个字符串 - 输出
你好,张三
其中 张三 要替换成用户真正输入的内容。
查看参考答案
| |
第 6 题:同时读取姓名和年龄
编写一个程序,要求用户按“姓名 年龄”的格式输入,例如:
| |
程序读取后输出:
| |
查看参考答案
| |
第 7 题:区分全局变量和局部变量
编写一个程序:
- 在函数外定义全局变量
courseName - 在
main函数里定义局部变量studentName - 输出一句话:
欢迎 小王 学习 Go 入门
其中变量值可以自行设置。
查看参考答案
| |
第 8 题:修正一段有问题的代码
下面这段代码有两个明显问题,请改正后让它可以正常运行:
| |
查看参考答案
修正后的代码:
| |
两个问题分别是:
fmt.Scan读取变量时需要传地址,所以应该写成&namename是字符串,Printf里应该使用%s,不能使用%d
第 9 题:格式化输出一张成绩单
已知下面几个变量:
| |
请使用 fmt.Printf 输出下面这张成绩单:
| |
要求:
- 成绩保留 1 位小数。
- 排名不足 3 位时在前面补
0。 - 完成度后面要正确输出百分号。
查看参考答案
| |
说明:
%s用来输出字符串。%d用来输出整数。%.1f表示浮点数保留 1 位小数。%03d表示整数至少占 3 位,不足的地方用0补齐。%t用来输出布尔值。%%用来输出一个真正的百分号。
进阶
下面两题会少量接触本章之外、但和输入输出强相关的内容,更接近真实开发里的控制台交互场景。
第 10 题:读取一整行自我介绍
在前面的 Scan / Scanln 示例里,我们读取的大多是一个值或空格分隔的多个值。
现在请尝试完成一个稍微更真实的场景:
- 提示用户输入一句自我介绍
- 允许这段输入里出现空格
- 程序读取整行内容后,输出
你的自我介绍是:xxx
例如输入:
| |
查看参考答案
先给出一个更简洁的主答案:
| |
说明:
bufio.NewScanner(os.Stdin)可以按整行读取输入scanner.Text()返回当前读到的这一整行内容- 这版更适合初学时先理解“如何读取带空格的一整行”
扩展写法:如果你想进一步了解更接近底层的按行读取方式,也可以这样写:
| |
补充说明:
ReadString('\n')会一直读取,直到遇到换行符strings.TrimSpace用来去掉输入末尾的换行- 如果读到文件结尾前已经拿到内容,
ReadString可能同时返回内容和io.EOF,这时仍然可以继续处理输入
第 11 题:把字符串年龄转换成整数
请编写一个程序:
- 先读取用户输入的年龄,但先把它当成字符串读取
- 再把这个字符串转换成整数
- 最后输出
明年你的年龄是:xx
例如输入:
| |
查看参考答案
| |
说明:
strconv.Atoi可以把字符串转换成整数- 这类写法很常见,适合处理“先读入文本,再做类型转换”的场景