本课目标:掌握 if、for、switch;理解 Go 循环只有 for;能用条件与循环完成猜数字小游戏。
一、知识点速览
- if 条件分支
go
if score >= 90 {
fmt.Println("优秀")
} else if score >= 60 {
fmt.Println("及格")
} else {
fmt.Println("不及格")
}
带初始化语句:
go
if x := 10; x > 5 {
fmt.Println(x)
}
注意:条件不需要括号,但必须有大括号 {}。
- for 循环
Go 只有 for,没有 while、do-while。
go
// 标准
for i := 0; i < 5; i++ {
fmt.Println(i)
}
// 类似 while
i := 0
for i < 5 {
fmt.Println(i)
i++
}
// 无限循环
for {
// ...
}
// range 遍历
nums := []int{10, 20, 30}
for i, v := range nums {
fmt.Println(i, v)
}
- switch 分支
go
switch day {
case 1, 2, 3, 4, 5:
fmt.Println("工作日")
case 6, 7:
fmt.Println("周末")
default:
fmt.Println("无效")
}
无表达式 switch:
go
switch {
case score >= 90:
fmt.Println("优秀")
case score >= 60:
fmt.Println("及格")
default:
fmt.Println("不及格")
}
fallthrough:强制执行下一个 case。
- 猜数字小游戏示例
go
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
rand.Seed(time.Now().UnixNano()) // Go 1.20+ 可省略
target := rand.Intn(100) + 1
var guess int
for {
fmt.Print("猜一个1-100的数字:")
fmt.Scanln(&guess)
if guess > target {
fmt.Println("大了")
} else if guess < target {
fmt.Println("小了")
} else {
fmt.Println("猜对了!")
break
}
}
}
二、多元化习题(每题后附答案与解读)
A. 选择题
- Go 中 if 条件是否需要括号?
A. 需要
B. 不需要
C. 可要可不要
D. 必须用括号
答案:B
解读: Go 的 if 条件不需要括号,但必须有大括号 {}。
- Go 中循环关键字有哪些?
A. for、while
B. for、do-while
C. 只有 for
D. loop
答案:C
解读: Go 只有 for 循环,没有 while 和 do-while。
- switch 中用于强制执行下一个 case 的关键字是?
A. break
B. continue
C. fallthrough
D. next
答案:C
解读: fallthrough 会无条件执行下一个 case。
- for range 遍历字符串时,返回什么?
A. 索引和字节
B. 索引和 rune
C. 只有值
D. 只有索引
答案:B
解读: for range 遍历字符串返回索引和 rune(Unicode 码点)。
- 无限循环写法是?
A. for(;😉
B. while(true)
C. for {}
D. loop {}
答案:C
解读: Go 中无限循环用 for {}。
B. 判断题
- if 语句的条件必须用括号括起来。
答案:错
解读: Go 不需要括号,直接写 if x > 0 { ... }。
- for 循环可以替代 while 循环。
答案:对
解读: Go 没有 while,用 for 条件 {} 实现。
- switch 的 case 默认不会贯穿,除非使用 fallthrough。
答案:对
解读: Go 的 switch 每个 case 默认自带 break。
- break 可以跳出 switch 和 for。
答案:对
解读: break 用于跳出当前循环或 switch。
- continue 可以用于 switch。
答案:错
解读: continue 只能用于循环,不能用于 switch。
C. 填空题
- if 条件语句:if x > 0 ____ { ... }
答案:{
解读: Go 的 if 条件后直接跟大括号。
- 标准 for 循环:for i := 0; i < 10; ____ { }
答案:i++
解读: 后置语句通常为 i++。
- 遍历切片:for ____, v := range nums { }
答案:i 或索引变量名
解读: range 返回索引和值。
- switch 中默认分支:____: fmt.Println("默认")
答案:default
解读: default 处理所有未匹配的情况。
- 跳出循环:____
答案:break
解读: break 跳出当前循环。
D. 代码阅读题
- 输出什么?
go
for i := 0; i < 3; i++ {
fmt.Print(i, " ")
}
答案:0 1 2
解读: i 从 0 到 2。
- 输出什么?
go
x := 5
if x > 3 {
fmt.Println("A")
} else {
fmt.Println("B")
}
答案:A
解读: x > 3 为真。
- 输出什么?
go
for i := 0; i < 5; i++ {
if i == 2 {
continue
}
fmt.Print(i, " ")
}
答案:0 1 3 4
解读: i == 2 时跳过本次循环。
- 输出什么?
go
switch 2 {
case 1:
fmt.Print("A")
case 2:
fmt.Print("B")
fallthrough
case 3:
fmt.Print("C")
default:
fmt.Print("D")
}
答案:BC
解读: 匹配 case 2 输出 B,fallthrough 继续执行 case 3 输出 C。
- 输出什么?
go
sum := 0
for i := 1; i <= 5; i++ {
sum += i
}
fmt.Println(sum)
答案:15
解读: 1+2+3+4+5=15。
E. 改错题
- 下面代码错在哪?
go
if x > 0
fmt.Println("正数")
答案:缺少大括号。
go
if x > 0 {
fmt.Println("正数")
}
解读: Go 的 if 必须有大括号。
- 下面代码错在哪?
go
for i := 0; i < 5; i++
fmt.Println(i)
答案:缺少大括号。
go
for i := 0; i < 5; i++ {
fmt.Println(i)
}
解读: for 循环体必须用大括号。
- 下面代码错在哪?
go
if x = 5 {
fmt.Println("等于5")
}
答案:应该用 == 比较。
go
if x == 5 {
fmt.Println("等于5")
}
解读: = 是赋值,== 是比较。
- 下面代码错在哪?
go
switch x {
case 1:
continue
}
答案:continue 不能用于 switch。
go
switch x {
case 1:
// 做其他事情
}
解读: continue 只能用于循环。
F. 编程题
- 判断一个数是正数、负数还是零。
go
package main
import "fmt"
func main() {
var n int
fmt.Print("请输入一个整数:")
fmt.Scanln(&n)
if n > 0 {
fmt.Println("正数")
} else if n < 0 {
fmt.Println("负数")
} else {
fmt.Println("零")
}
}
解读: 使用 if-else if-else 完成多分支判断。
- 打印 1 到 100 之间所有偶数。
go
for i := 1; i <= 100; i++ {
if i%2 == 0 {
fmt.Print(i, " ")
}
}
解读: i%2 == 0 判断偶数。
- 使用 switch 判断成绩等级:90-100 优秀,80-89 良好,60-79 及格,0-59 不及格。
go
var score int
fmt.Scanln(&score)
switch {
case score >= 90:
fmt.Println("优秀")
case score >= 80:
fmt.Println("良好")
case score >= 60:
fmt.Println("及格")
default:
fmt.Println("不及格")
}
解读: 使用无表达式 switch,条件写在 case 中。
G. 挑战题
- 猜数字小游戏:随机生成 1-100,循环让用户猜,提示大了小了,猜对后输出次数。
go
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
rand.Seed(time.Now().UnixNano()) // Go 1.20+ 可省略
target := rand.Intn(100) + 1
var guess int
count := 0
for {
fmt.Print("猜一个1-100的数字:")
fmt.Scanln(&guess)
count++
if guess > target {
fmt.Println("大了")
} else if guess < target {
fmt.Println("小了")
} else {
fmt.Printf("猜对了!你用了%d次\n", count)
break
}
}
}
解读: 使用 for 无限循环,break 跳出。
- 打印九九乘法表。
go
for i := 1; i <= 9; i++ {
for j := 1; j <= i; j++ {
fmt.Printf("%d*%d=%d\t", j, i, i*j)
}
fmt.Println()
}
解读: 嵌套循环,外层控制行,内层控制列。
H. 拓展思考题
- Go 为什么没有 while 循环?
答案: Go 设计者认为 for 足够灵活,可以用 for 条件 {} 替代 while,减少关键字。
解读: 简化语言,降低学习成本。
- switch 中的 fallthrough 有什么作用?
答案: 强制执行下一个 case,不考虑条件。
解读: 通常用于多个 case 共享逻辑。
下节预告:函数、数组、切片、map,做一个通讯录小练习。