第3章:控制结构
3.1 条件语句
if 语句
go
// 基本语法(不需要括号)
if age >= 18 {
fmt.Println("成年人")
}
// 条件语句可以包含初始化语句
if score := getScore(); score >= 90 {
fmt.Println("优秀")
} else if score >= 60 {
fmt.Println("及格")
} else {
fmt.Println("不及格")
}
多条件判断
go
// 使用 && 和 ||
if age >= 18 && age <= 65 {
fmt.Println("劳动年龄")
}
if day == "Saturday" || day == "Sunday" {
fmt.Println("周末")
}
错误处理中的 if
go
// Go 的惯用错误处理模式
result, err := doSomething()
if err != nil {
fmt.Println("发生错误:", err)
return
}
// 使用错误变量作用域
if err := doSomethingElse(); err != nil {
fmt.Println("错误:", err)
}
3.2 switch 语句
基本 switch
go
// 基本语法
switch day {
case "Monday":
fmt.Println("星期一")
case "Tuesday":
fmt.Println("星期二")
case "Wednesday", "Thursday", "Friday":
fmt.Println("工作日")
default:
fmt.Println("其他")
}
无条件 switch
go
// 可以省略条件变量,相当于 if-else 链
switch {
case score >= 90:
grade = "A"
case score >= 80:
grade = "B"
case score >= 70:
grade = "C"
case score >= 60:
grade = "D"
default:
grade = "F"
}
类型 switch
go
// 接口类型断言
func printType(x interface{}) {
switch x.(type) {
case int:
fmt.Printf("整数: %d\n", x)
case float64:
fmt.Printf("浮点数: %f\n", x)
case string:
fmt.Printf("字符串: %s\n", x)
default:
fmt.Printf("未知类型: %T\n", x)
}
}
fallthrough
go
// 使用 fallthrough 强制执行下一个 case
switch num := 1; {
case num > 0:
fmt.Println("正数")
fallthrough
case num > -10:
fmt.Println("大于 -10")
// 注意:fallthrough 不会检查下一个 case 的条件
}
3.3 循环语句
Go 只有 for 循环,但支持多种循环模式。
基本 for 循环
go
// 标准 for 循环
for i := 0; i < 10; i++ {
fmt.Println(i)
}
// 循环条件
sum := 0
for i := 1; i <= 100; i++ {
sum += i
}
fmt.Println("1到100的和:", sum)
while 循环模拟
go
// Go 没有 while,但可以用 for 模拟
n := 10
for n > 0 {
fmt.Println(n)
n--
}
// 无限循环
for {
// 使用 break 退出
if someCondition {
break
}
}
range 循环
go
// 遍历切片
fruits := []string{"苹果", "香蕉", "橙子"}
for index, value := range fruits {
fmt.Printf("索引: %d, 值: %s\n", index, value)
}
// 只需要值
for _, value := range fruits {
fmt.Println(value)
}
// 只需要索引
for i := range fruits {
fmt.Println(i)
}
// 遍历 map
user := map[string]int{
"张三": 25,
"李四": 30,
}
for name, age := range user {
fmt.Printf("%s: %d岁\n", name, age)
}
// 遍历字符串(处理 Unicode)
for i, r := range "Hello, 世界" {
fmt.Printf("索引: %d, 字符: %c, Unicode: %U\n", i, r, r)
}
break 和 continue
go
// break - 退出循环
for i := 0; i < 100; i++ {
if i == 5 {
break // 退出循环
}
fmt.Println(i)
}
// continue - 跳过当前迭代
for i := 0; i < 10; i++ {
if i%2 == 0 {
continue // 跳过偶数
}
fmt.Println(i) // 只打印奇数
}
// 标签 - 退出多层循环
outer:
for i := 0; i < 10; i++ {
for j := 0; j < 10; j++ {
if i*j > 20 {
break outer // 退出外层循环
}
fmt.Printf("%d ", i*j)
}
fmt.Println()
}
3.4 defer 语句
defer 用于延迟执行函数调用,常用于资源清理:
go
func readFile(filename string) error {
file, err := os.Open(filename)
if err != nil {
return err
}
defer file.Close() // 函数返回前执行
// 处理文件...
return nil
}
defer 执行顺序
go
func main() {
// defer 是后进先出(LIFO)
defer fmt.Println("1")
defer fmt.Println("2")
defer fmt.Println("3")
// 输出:3, 2, 1
}
defer 与命名返回值
go
func double(x int) (result int) {
defer func() { result *= 2 }() // 修改返回值
return x
}
fmt.Println(double(3)) // 输出:6
3.5 练习
- 编写程序判断一个数是否为素数
- 使用 switch 实现一个简单的计算器
- 使用 for 循环打印九九乘法表
- 编写程序使用 defer 实现函数执行时间统计
3.6 下一章
下一章我们将学习 Go 语言的函数与方法。