章节

2.7 练习

本篇通过若干分级练习巩固基本数据类型、字符与字符串、类型转换,并能识别常见类型错误。

练习

学完本章你应该掌握

  • 能声明并区分 intfloat64boolstringbyterune 等常见类型,并使用正确的格式化占位符输出。
  • 能识别字符与字符串的区别,理解单引号、双引号,以及 byterune 的基本使用场景。
  • 能在整数与浮点数混合计算时完成显式类型转换,避免整数除法和类型不兼容问题。
  • 能理解字符串的字节长度和字符个数不是一回事,并在中英文混合文本中做出正确判断。
  • 能识别并修正本章常见错误,例如不同类型直接运算、错误的字面量写法、错误的输出格式。
  • 能把本章知识迁移到基础数据处理场景,例如资料录入、数值比较、文本数字转换。

简单

第 1 题:写出不同类型的输出结果

第 1 题 简单

阅读下面代码,写出它的输出结果:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
package main

import "fmt"

func main() {
	age := 18
	price := 19.9
	passed := false
	first := 'G'

	fmt.Printf("age=%d\n", age)
	fmt.Printf("price=%.1f\n", price)
	fmt.Printf("passed=%t\n", passed)
	fmt.Printf("first=%c, code=%d\n", first, first)
}
查看参考答案
1
2
3
4
age=18
price=19.9
passed=false
first=G, code=71

说明:%c 按字符输出,%d 按整数码点输出,所以 'G' 会显示成字符 G 和码点 71

第 2 题:判断哪些声明是合法的

第 2 题 简单

下面这些声明里,哪些可以通过编译,哪些不可以?请分别写出结果,并简要说明原因。

1
2
3
4
5
6
A. var a int = 18
B. var b float64 = 18
C. var c bool = 1
D. var d byte = 'A'
E. var e string = 'A'
F. var f rune = '中'
查看参考答案

可以通过编译的是:

1
A、B、D、F

不能通过编译的是:

1
C、E

原因说明:

  • A 合法,18 是整数常量,可以赋值给 int
  • B 合法,18 是无类型整数常量,可以赋值给 float64
  • C 不合法,bool 只能是 truefalse,不能写成 1
  • D 合法,'A' 是字符字面量,byte 可以保存单字节字符。
  • E 不合法,'A' 是字符,不是字符串;字符串应该用双引号,例如 "A"
  • F 合法,rune 适合表示 Unicode 字符,例如中文。

第 3 题:补全平均值计算中的类型转换

第 3 题 简单

已知下面代码:

1
2
3
4
total := 95
count := 2
avg := ________
fmt.Printf("平均分:%.1f\n", avg)

请补全 avg 的计算,让程序输出:

1
平均分:47.5
查看参考答案
1
avg := float64(total) / float64(count)

说明:totalcount 都是 int,直接相除会得到整数结果,所以要先转成 float64

第 4 题:修正字符输出程序

第 4 题 简单

下面代码的目标是输出字符 A 和字符 ,但现在有问题。请改正后让它正常运行:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
package main

import "fmt"

func main() {
	var first byte = "A"
	var city rune = '上'

	fmt.Printf("first=%s\n", first)
	fmt.Printf("city=%d\n", city)
}
查看参考答案

修正后的代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
package main

import "fmt"

func main() {
	var first byte = 'A'
	var city rune = '上'

	fmt.Printf("first=%c\n", first)
	fmt.Printf("city=%c\n", city)
}

两个关键问题分别是:

  • byte 保存字符时要使用单引号,"A" 是字符串,不是字符。
  • 如果想按字符显示,应该使用 %c,而不是 %s%d

第 5 题:写出布尔表达式的结果

第 5 题 简单

阅读下面代码,写出它的输出结果:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
package main

import "fmt"

func main() {
	score := 58
	retake := true
	vip := false

	a := score >= 60
	b := (score >= 60) || retake
	c := b && !vip

	fmt.Println(a)
	fmt.Println(b)
	fmt.Println(c)
}
查看参考答案
1
2
3
false
true
true

说明:

  • a 表示 58 >= 60,所以是 false
  • b 表示“及格或者允许补考”,因为 retaketrue,所以结果是 true
  • c 表示 b 为真并且不是 vip,所以结果仍然是 true

一般

第 6 题:解释字符串长度为什么不同

第 6 题 一般

阅读下面代码,写出它的输出结果,并说明为什么两个数字不同:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
package main

import (
	"fmt"
	"unicode/utf8"
)

func main() {
	word := "Go语言"

	fmt.Printf("len=%d\n", len(word))
	fmt.Printf("runes=%d\n", utf8.RuneCountInString(word))
}
查看参考答案

输出结果:

1
2
len=8
runes=4

原因说明:

  • len(word) 统计的是字节数,Go 各占 1 个字节, 在 UTF-8 中通常各占 3 个字节,所以总共是 8
  • utf8.RuneCountInString(word) 统计的是字符个数,所以 Go语言 一共是 4 个字符。

第 7 题:修正混合数值计算程序

第 7 题 一般

下面程序想输出:

1
2
sum=120
avg=33.3

但它现在不能正确运行。请改正后让它得到预期结果。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
package main

import "fmt"

func main() {
	var total int32 = 100
	var extra int64 = 20

	sum := total + extra
	avg := total / 3

	fmt.Printf("sum=%d\n", sum)
	fmt.Printf("avg=%.1f\n", avg)
}
查看参考答案

修正后的代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
package main

import "fmt"

func main() {
	var total int32 = 100
	var extra int64 = 20

	sum := int64(total) + extra
	avg := float64(total) / 3

	fmt.Printf("sum=%d\n", sum)
	fmt.Printf("avg=%.1f\n", avg)
}

关键点:

  • int32int64 不能直接相加,所以 total 需要先转换成 int64
  • total / 3 如果保持整数运算,会丢失小数部分,所以要先转成 float64

第 8 题:编写一张资料卡

第 8 题 一般

编写一个程序,要求用户按“姓名 年龄 身高 是否通过”的格式输入,例如:

1
阿斌 18 172.5 true

程序读取后输出:

1
姓名:阿斌,年龄:18,身高:172.5cm,是否通过:true

其中:

  • 姓名使用 string
  • 年龄使用 int
  • 身高使用 float64
  • 是否通过使用 bool
查看参考答案
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
package main

import "fmt"

func main() {
	var name string
	var age int
	var height float64
	var passed bool

	fmt.Print("请输入姓名、年龄、身高、是否通过:")
	fmt.Scan(&name, &age, &height, &passed)

	fmt.Printf("姓名:%s,年龄:%d,身高:%.1fcm,是否通过:%t\n", name, age, height, passed)
}

说明:这道题的重点不是输入本身,而是让不同类型的变量在同一个小场景里配合使用,并用正确的占位符输出。

进阶

下面两题会少量接触本章之外、但和本章内容强相关的标准库函数,用来帮助你把类型知识放到更真实的问题里。

第 9 题:避免直接比较浮点数

第 9 题 进阶

我们知道 0.1 + 0.2 == 0.3 在 Go 里不一定得到 true
请补全下面程序,让它通过“误差足够小”的方式判断两个浮点数是否近似相等,并输出:

1
approxEqual=true
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
package main

import (
	"fmt"
	"math"
)

func main() {
	a := 0.1 + 0.2
	b := 0.3

	approxEqual := ______________________
	fmt.Printf("approxEqual=%t\n", approxEqual)
}
查看参考答案
1
approxEqual := math.Abs(a-b) < 0.000001

完整代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
package main

import (
	"fmt"
	"math"
)

func main() {
	a := 0.1 + 0.2
	b := 0.3

	approxEqual := math.Abs(a-b) < 0.000001
	fmt.Printf("approxEqual=%t\n", approxEqual)
}

说明:math.Abs 用来求绝对值。浮点数常常不能被精确表示,所以实际开发里更常见的是比较“差值是否足够小”,而不是直接用 ==

第 10 题:把文本年龄转换成整数

第 10 题 进阶

编写一个程序:

  • 读取用户输入的姓名和年龄文本,例如:
1
小王 18
  • 年龄先用 string 接收
  • 再把年龄文本转换成整数
  • 如果转换成功,输出:
1
小王明年 19 岁
  • 如果转换失败,输出:
1
年龄必须是整数
查看参考答案
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package main

import (
	"fmt"
	"strconv"
)

func main() {
	var name string
	var ageText string

	fmt.Print("请输入姓名和年龄:")
	_, err := fmt.Scan(&name, &ageText)
	if err != nil {
		fmt.Println("输入有误:", err)
		return
	}

	age, err := strconv.Atoi(ageText)
	if err != nil {
		fmt.Println("年龄必须是整数")
		return
	}

	fmt.Printf("%s明年 %d 岁\n", name, age+1)
}

说明:strconv.Atoi 可以把字符串转换成整数。这类“先按文本读取,再做类型转换”的写法很常见,适合处理用户输入的数据。

本文禁止转载
使用 Hugo 构建
主题 StackJimmy 设计 由 Hobin 魔改
最近构建时间:2026-04-17 19:07:48 CST
载入天数...载入时分秒...
发表了 1 篇文章 · 发表了 152 篇笔记 · 总计 18 万 0 千字