章节

1.5 练习

本篇通过 11 道分级练习巩固变量、输出、格式化输出与输入,并能独立写出基础控制台程序。

练习

学完本章你应该掌握

  • 能使用 var:= 完成基础变量声明,并理解零值、全局变量、局部变量的区别。
  • 能根据场景选择 fmt.Printfmt.Printlnfmt.Printf,写出普通输出和格式化输出。
  • 能使用 fmt.Scanfmt.Scanln 读取一个或多个输入值,并知道为什么要传变量地址。
  • 能识别并修正常见输入输出错误,例如占位符类型不匹配、读取时漏写 &、把 := 用在函数外。
  • 能把本章的输入输出知识迁移到稍复杂一点的控制台交互场景,例如整行读取、输入转换、简单输入校验。

简单

第 1 题:声明并输出三个变量

第 1 题 简单

编写一个 Go 程序,完成下面要求:

  • 声明 nameagecity 三个变量。
  • 至少使用一次 var,至少使用一次 :=
  • 把这三个变量分别输出到控制台,每个值占一行。
查看参考答案
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
package main

import "fmt"

func main() {
	var name string = "阿斌"
	age := 18
	var city = "上海"

	fmt.Println(name)
	fmt.Println(age)
	fmt.Println(city)
}

第 2 题:观察变量的零值

第 2 题 简单

声明下面三个变量,但先不要赋值:

  • score int
  • nickname string
  • passed bool

然后把它们输出出来,观察默认值分别是什么。

扩展思考:既然字符串内容直接输出时不明显,怎么做才能输出 " " 呢?

查看参考答案
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
package main

import "fmt"

func main() {
	var score int
	var nickname string
	var passed bool

	fmt.Println(score)
	fmt.Println(nickname)
	fmt.Println(passed)
}

输出结果:

1
2
3
0

false

说明:第二行是空字符串,所以看起来像“空了一行”。

扩展写法,可以把下面代码放到 main 函数里继续观察:

1
2
3
4
5
6
space := " "

fmt.Printf("nickname=%q, len=%d\n", nickname, len(nickname))
fmt.Printf("space=%q, len=%d\n", space, len(space))
fmt.Println("[" + nickname + "]")
fmt.Println("[" + space + "]")

输出结果:

1
2
3
4
nickname="", len=0
space=" ", len=1
[]
[ ]

说明:len 可以查看字符串长度。空字符串 "" 的长度是 0,空格字符串 " " 的长度是 1。如果只是 fmt.Print(" ")fmt.Println(" "),控制台确实会输出一个空格,但肉眼很难看出来;用 %q 或给它加上 [] 这样的边界,就能明显看出它存在。

第 3 题:写出下面程序的输出结果

第 3 题 简单

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

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

import "fmt"

func main() {
	fmt.Print("Go")
	fmt.Print("语言")
	fmt.Println("入门")
	fmt.Printf("第%d课\n", 1)
}
查看参考答案
1
2
Go语言入门
第1课

说明:前两个 Print 不换行,Println 会在末尾补一个换行。

第 4 题:补全 Printf 的占位符

第 4 题 简单

已知下面三个变量:

1
2
3
name := "小李"
age := 18
score := 96.5

请补全这一行代码中的占位符,让成绩保留 1 位小数:

1
fmt.Printf("姓名:__,年龄:__,成绩:__\n", name, age, score)
查看参考答案
1
fmt.Printf("姓名:%s,年龄:%d,成绩:%.1f\n", name, age, score)

说明:

  • %s 输出字符串
  • %d 输出整数
  • %.1f 输出浮点数并保留 1 位小数

一般

第 5 题:读取一个姓名并输出欢迎语

第 5 题 一般

编写一个程序:

  • 提示用户输入姓名
  • 使用 fmt.Scanln 读取一个字符串
  • 输出 你好,张三

其中 张三 要替换成用户真正输入的内容。

查看参考答案
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
package main

import "fmt"

func main() {
	var name string

	fmt.Print("请输入姓名:")
	fmt.Scanln(&name)

	fmt.Printf("你好,%s\n", name)
}

第 6 题:同时读取姓名和年龄

第 6 题 一般

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

1
阿斌 18

程序读取后输出:

1
name=阿斌, age=18
查看参考答案
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
package main

import "fmt"

func main() {
	var name string
	var age int

	fmt.Print("请输入姓名和年龄(空格分隔):")
	fmt.Scan(&name, &age)

	fmt.Printf("name=%s, age=%d\n", name, age)
}

第 7 题:区分全局变量和局部变量

第 7 题 一般

编写一个程序:

  • 在函数外定义全局变量 courseName
  • main 函数里定义局部变量 studentName
  • 输出一句话:欢迎 小王 学习 Go 入门

其中变量值可以自行设置。

查看参考答案
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
package main

import "fmt"

var courseName = "Go 入门"

func main() {
	studentName := "小王"
	fmt.Printf("欢迎 %s 学习 %s\n", studentName, courseName)
}

第 8 题:修正一段有问题的代码

第 8 题 一般

下面这段代码有两个明显问题,请改正后让它可以正常运行:

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

import "fmt"

func main() {
	var name string

	fmt.Print("请输入姓名:")
	fmt.Scan(name)
	fmt.Printf("你好,%d\n", name)
}
查看参考答案

修正后的代码:

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

import "fmt"

func main() {
	var name string

	fmt.Print("请输入姓名:")
	fmt.Scan(&name)
	fmt.Printf("你好,%s\n", name)
}

两个问题分别是:

  • fmt.Scan 读取变量时需要传地址,所以应该写成 &name
  • name 是字符串,Printf 里应该使用 %s,不能使用 %d

第 9 题:格式化输出一张成绩单

第 9 题 一般

已知下面几个变量:

1
2
3
4
5
6
name := "小王"
age := 18
score := 93.456
rank := 7
passed := true
progress := 85

请使用 fmt.Printf 输出下面这张成绩单:

1
2
3
4
5
6
姓名:小王
年龄:18
成绩:93.5
排名:007
是否通过:true
完成度:85%

要求:

  • 成绩保留 1 位小数。
  • 排名不足 3 位时在前面补 0
  • 完成度后面要正确输出百分号。
查看参考答案
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
package main

import "fmt"

func main() {
	name := "小王"
	age := 18
	score := 93.456
	rank := 7
	passed := true
	progress := 85

	fmt.Printf("姓名:%s\n", name)
	fmt.Printf("年龄:%d\n", age)
	fmt.Printf("成绩:%.1f\n", score)
	fmt.Printf("排名:%03d\n", rank)
	fmt.Printf("是否通过:%t\n", passed)
	fmt.Printf("完成度:%d%%\n", progress)
}

说明:

  • %s 用来输出字符串。
  • %d 用来输出整数。
  • %.1f 表示浮点数保留 1 位小数。
  • %03d 表示整数至少占 3 位,不足的地方用 0 补齐。
  • %t 用来输出布尔值。
  • %% 用来输出一个真正的百分号。

进阶

下面两题会少量接触本章之外、但和输入输出强相关的内容,更接近真实开发里的控制台交互场景。

第 10 题:读取一整行自我介绍

第 10 题 进阶

在前面的 Scan / Scanln 示例里,我们读取的大多是一个值或空格分隔的多个值。
现在请尝试完成一个稍微更真实的场景:

  • 提示用户输入一句自我介绍
  • 允许这段输入里出现空格
  • 程序读取整行内容后,输出 你的自我介绍是:xxx

例如输入:

1
大家好,我正在学习 Go 语言
查看参考答案

先给出一个更简洁的主答案:

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

import (
	"bufio"
	"fmt"
	"os"
)

func main() {
	scanner := bufio.NewScanner(os.Stdin)

	fmt.Print("请输入一句自我介绍:")
	if scanner.Scan() {
		intro := scanner.Text()
		fmt.Printf("你的自我介绍是:%s\n", intro)
	}

	if err := scanner.Err(); err != nil {
		fmt.Println("输入有误:", err)
	}
}

说明:

  • bufio.NewScanner(os.Stdin) 可以按整行读取输入
  • scanner.Text() 返回当前读到的这一整行内容
  • 这版更适合初学时先理解“如何读取带空格的一整行”

扩展写法:如果你想进一步了解更接近底层的按行读取方式,也可以这样写:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package main

import (
	"bufio"
	"fmt"
	"io"
	"os"
	"strings"
)

func main() {
	reader := bufio.NewReader(os.Stdin)

	fmt.Print("请输入一句自我介绍:")
	intro, err := reader.ReadString('\n')
	if err != nil && err != io.EOF {
		fmt.Println("输入有误:", err)
		return
	}

	intro = strings.TrimSpace(intro)
	fmt.Printf("你的自我介绍是:%s\n", intro)
}

补充说明:

  • ReadString('\n') 会一直读取,直到遇到换行符
  • strings.TrimSpace 用来去掉输入末尾的换行
  • 如果读到文件结尾前已经拿到内容,ReadString 可能同时返回内容和 io.EOF,这时仍然可以继续处理输入

第 11 题:把字符串年龄转换成整数

第 11 题 进阶

请编写一个程序:

  • 先读取用户输入的年龄,但先把它当成字符串读取
  • 再把这个字符串转换成整数
  • 最后输出 明年你的年龄是:xx

例如输入:

1
18
查看参考答案
 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
package main

import (
	"fmt"
	"strconv"
)

func main() {
	var ageText string

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

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

	fmt.Printf("明年你的年龄是:%d\n", age+1)
}

说明:

  • strconv.Atoi 可以把字符串转换成整数
  • 这类写法很常见,适合处理“先读入文本,再做类型转换”的场景
本文禁止转载
使用 Hugo 构建
主题 StackJimmy 设计 由 Hobin 魔改
最近构建时间:2026-04-17 19:07:48 CST
载入天数...载入时分秒...
发表了 1 篇文章 · 发表了 152 篇笔记 · 总计 18 万 0 千字