练习
学完本章你应该掌握
- 能声明并区分
int、float64、bool、string、byte、rune等常见类型,并使用正确的格式化占位符输出。 - 能识别字符与字符串的区别,理解单引号、双引号,以及
byte、rune的基本使用场景。 - 能在整数与浮点数混合计算时完成显式类型转换,避免整数除法和类型不兼容问题。
- 能理解字符串的字节长度和字符个数不是一回事,并在中英文混合文本中做出正确判断。
- 能识别并修正本章常见错误,例如不同类型直接运算、错误的字面量写法、错误的输出格式。
- 能把本章知识迁移到基础数据处理场景,例如资料录入、数值比较、文本数字转换。
简单
第 1 题:写出不同类型的输出结果
阅读下面代码,写出它的输出结果:
| |
查看参考答案
| |
说明:%c 按字符输出,%d 按整数码点输出,所以 'G' 会显示成字符 G 和码点 71。
第 2 题:判断哪些声明是合法的
下面这些声明里,哪些可以通过编译,哪些不可以?请分别写出结果,并简要说明原因。
| |
查看参考答案
可以通过编译的是:
| |
不能通过编译的是:
| |
原因说明:
A合法,18是整数常量,可以赋值给int。B合法,18是无类型整数常量,可以赋值给float64。C不合法,bool只能是true或false,不能写成1。D合法,'A'是字符字面量,byte可以保存单字节字符。E不合法,'A'是字符,不是字符串;字符串应该用双引号,例如"A"。F合法,rune适合表示 Unicode 字符,例如中文。
第 3 题:补全平均值计算中的类型转换
已知下面代码:
| |
请补全 avg 的计算,让程序输出:
| |
查看参考答案
| |
说明:total 和 count 都是 int,直接相除会得到整数结果,所以要先转成 float64。
第 4 题:修正字符输出程序
下面代码的目标是输出字符 A 和字符 上,但现在有问题。请改正后让它正常运行:
| |
查看参考答案
修正后的代码:
| |
两个关键问题分别是:
byte保存字符时要使用单引号,"A"是字符串,不是字符。- 如果想按字符显示,应该使用
%c,而不是%s或%d。
第 5 题:写出布尔表达式的结果
阅读下面代码,写出它的输出结果:
| |
查看参考答案
| |
说明:
a表示58 >= 60,所以是false。b表示“及格或者允许补考”,因为retake是true,所以结果是true。c表示b为真并且不是vip,所以结果仍然是true。
一般
第 6 题:解释字符串长度为什么不同
阅读下面代码,写出它的输出结果,并说明为什么两个数字不同:
| |
查看参考答案
输出结果:
| |
原因说明:
len(word)统计的是字节数,G和o各占 1 个字节,语和言在 UTF-8 中通常各占 3 个字节,所以总共是8。utf8.RuneCountInString(word)统计的是字符个数,所以Go语言一共是4个字符。
第 7 题:修正混合数值计算程序
下面程序想输出:
| |
但它现在不能正确运行。请改正后让它得到预期结果。
| |
查看参考答案
修正后的代码:
| |
关键点:
int32和int64不能直接相加,所以total需要先转换成int64。total / 3如果保持整数运算,会丢失小数部分,所以要先转成float64。
第 8 题:编写一张资料卡
编写一个程序,要求用户按“姓名 年龄 身高 是否通过”的格式输入,例如:
| |
程序读取后输出:
| |
其中:
- 姓名使用
string - 年龄使用
int - 身高使用
float64 - 是否通过使用
bool
查看参考答案
| |
说明:这道题的重点不是输入本身,而是让不同类型的变量在同一个小场景里配合使用,并用正确的占位符输出。
进阶
下面两题会少量接触本章之外、但和本章内容强相关的标准库函数,用来帮助你把类型知识放到更真实的问题里。
第 9 题:避免直接比较浮点数
我们知道 0.1 + 0.2 == 0.3 在 Go 里不一定得到 true。
请补全下面程序,让它通过“误差足够小”的方式判断两个浮点数是否近似相等,并输出:
| |
| |
查看参考答案
| |
完整代码:
| |
说明:math.Abs 用来求绝对值。浮点数常常不能被精确表示,所以实际开发里更常见的是比较“差值是否足够小”,而不是直接用 ==。
第 10 题:把文本年龄转换成整数
编写一个程序:
- 读取用户输入的姓名和年龄文本,例如:
| |
- 年龄先用
string接收 - 再把年龄文本转换成整数
- 如果转换成功,输出:
| |
- 如果转换失败,输出:
| |
查看参考答案
| |
说明:strconv.Atoi 可以把字符串转换成整数。这类“先按文本读取,再做类型转换”的写法很常见,适合处理用户输入的数据。