【Go入门练中学】第2课:条件与循环

本课目标:掌握 if、for、switch;理解 Go 循环只有 for;能用条件与循环完成猜数字小游戏。


一、知识点速览

  1. 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)
}

注意:条件不需要括号,但必须有大括号 {}。

  1. 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)
}
  1. 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。

  1. 猜数字小游戏示例
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. 选择题

  1. Go 中 if 条件是否需要括号?
    A. 需要
    B. 不需要
    C. 可要可不要
    D. 必须用括号

答案:B

解读: Go 的 if 条件不需要括号,但必须有大括号 {}。


  1. Go 中循环关键字有哪些?
    A. for、while
    B. for、do-while
    C. 只有 for
    D. loop

答案:C

解读: Go 只有 for 循环,没有 while 和 do-while。


  1. switch 中用于强制执行下一个 case 的关键字是?
    A. break
    B. continue
    C. fallthrough
    D. next

答案:C

解读: fallthrough 会无条件执行下一个 case。


  1. for range 遍历字符串时,返回什么?
    A. 索引和字节
    B. 索引和 rune
    C. 只有值
    D. 只有索引

答案:B

解读: for range 遍历字符串返回索引和 rune(Unicode 码点)。


  1. 无限循环写法是?
    A. for(;😉
    B. while(true)
    C. for {}
    D. loop {}

答案:C

解读: Go 中无限循环用 for {}。


B. 判断题

  1. if 语句的条件必须用括号括起来。
    答案:错
    解读: Go 不需要括号,直接写 if x > 0 { ... }。

  1. for 循环可以替代 while 循环。
    答案:对
    解读: Go 没有 while,用 for 条件 {} 实现。

  1. switch 的 case 默认不会贯穿,除非使用 fallthrough。
    答案:对
    解读: Go 的 switch 每个 case 默认自带 break。

  1. break 可以跳出 switch 和 for。
    答案:对
    解读: break 用于跳出当前循环或 switch。

  1. continue 可以用于 switch。
    答案:错
    解读: continue 只能用于循环,不能用于 switch。

C. 填空题

  1. if 条件语句:if x > 0 ____ { ... }
    答案:{
    解读: Go 的 if 条件后直接跟大括号。

  1. 标准 for 循环:for i := 0; i < 10; ____ { }
    答案:i++
    解读: 后置语句通常为 i++。

  1. 遍历切片:for ____, v := range nums { }
    答案:i 或索引变量名
    解读: range 返回索引和值。

  1. switch 中默认分支:____: fmt.Println("默认")
    答案:default
    解读: default 处理所有未匹配的情况。

  1. 跳出循环:____
    答案:break
    解读: break 跳出当前循环。

D. 代码阅读题

  1. 输出什么?
go 复制代码
for i := 0; i < 3; i++ {
    fmt.Print(i, " ")
}

答案:0 1 2

解读: i 从 0 到 2。


  1. 输出什么?
go 复制代码
x := 5
if x > 3 {
    fmt.Println("A")
} else {
    fmt.Println("B")
}

答案:A

解读: x > 3 为真。


  1. 输出什么?
go 复制代码
for i := 0; i < 5; i++ {
    if i == 2 {
        continue
    }
    fmt.Print(i, " ")
}

答案:0 1 3 4

解读: i == 2 时跳过本次循环。


  1. 输出什么?
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。


  1. 输出什么?
go 复制代码
sum := 0
for i := 1; i <= 5; i++ {
    sum += i
}
fmt.Println(sum)

答案:15

解读: 1+2+3+4+5=15。


E. 改错题

  1. 下面代码错在哪?
go 复制代码
if x > 0
    fmt.Println("正数")

答案:缺少大括号。

go 复制代码
if x > 0 {
    fmt.Println("正数")
}

解读: Go 的 if 必须有大括号。


  1. 下面代码错在哪?
go 复制代码
for i := 0; i < 5; i++
    fmt.Println(i)

答案:缺少大括号。

go 复制代码
for i := 0; i < 5; i++ {
    fmt.Println(i)
}

解读: for 循环体必须用大括号。


  1. 下面代码错在哪?
go 复制代码
if x = 5 {
    fmt.Println("等于5")
}

答案:应该用 == 比较。

go 复制代码
if x == 5 {
    fmt.Println("等于5")
}

解读: = 是赋值,== 是比较。


  1. 下面代码错在哪?
go 复制代码
switch x {
case 1:
    continue
}

答案:continue 不能用于 switch。

go 复制代码
switch x {
case 1:
    // 做其他事情
}

解读: continue 只能用于循环。


F. 编程题

  1. 判断一个数是正数、负数还是零。
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. 打印 1 到 100 之间所有偶数。
go 复制代码
for i := 1; i <= 100; i++ {
    if i%2 == 0 {
        fmt.Print(i, " ")
    }
}

解读: i%2 == 0 判断偶数。


  1. 使用 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. 猜数字小游戏:随机生成 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 跳出。


  1. 打印九九乘法表。
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. 拓展思考题

  1. Go 为什么没有 while 循环?
    答案: Go 设计者认为 for 足够灵活,可以用 for 条件 {} 替代 while,减少关键字。
    解读: 简化语言,降低学习成本。

  1. switch 中的 fallthrough 有什么作用?
    答案: 强制执行下一个 case,不考虑条件。
    解读: 通常用于多个 case 共享逻辑。

下节预告:函数、数组、切片、map,做一个通讯录小练习。

相关推荐
wno7041 小时前
Spring Security基础使用
java·后端·spring
Go_error1 小时前
那个让我们损失了 47,000 美元 AWS 账单的互斥锁错误
后端
小小de风呀1 小时前
de风——【从零开始学C++】(二十)红黑树封装map和set
c++·学习
Go_error1 小时前
接口何时冗余:一种用于 Go 测试的精简依赖注入方法
后端
鱼弦1 小时前
长尾场景的挑战:大模型如何处理极其冷门的知识?
后端
孙启超1 小时前
【AI开发之Rust】第 8 课:泛型、trait 与 trait 对象
开发语言·后端·rust
co松柏1 小时前
一文吃透 Pi:10w stars 的极简 Agent harness
后端·架构
joinwell521 小时前
没收到回复,再点一次会启动两个 AI 吗?
人工智能·后端
爱吃苹果的日记本1 小时前
数据结构第四课—线性表Linear List
数据结构·学习