自学内容网 自学内容网

Go语言中的控制结构(四)

Go语言中的控制结构详解

在这里插入图片描述

控制结构是编程语言中控制代码执行流程的核心部分,Go语言通过ifforswitch等常见的控制结构,以及独有的deferpanicrecover机制,提供了强大且简洁的控制流管理。本文将详细讲解Go语言中的控制结构,包括条件判断、循环结构、多分支选择、延迟执行及错误处理机制。

1. 条件语句

Go语言的条件语句与其他编程语言类似,通过 ifelseelse if 来实现条件判断。

if 和 else 的使用

Go的 if 语句不需要用圆括号包围条件表达式,同时支持在条件判断之前执行初始化语句。

package main

import "fmt"

func main() {
    x := 10

    if x > 5 {
        fmt.Println("x 大于 5")
    } else {
        fmt.Println("x 小于或等于 5")
    }
}
  • 条件表达式中的布尔值决定了代码块的执行。
  • else 语句是可选的,且必须紧跟 if 语句的结束大括号。
多条件判断(else if)

对于多个条件判断,Go使用 else if 语句来处理。通过 else if,我们可以依次判断多个条件。

package main

import "fmt"

func main() {
    score := 85

    if score >= 90 {
        fmt.Println("优秀")
    } else if score >= 75 {
        fmt.Println("良好")
    } else if score >= 60 {
        fmt.Println("及格")
    } else {
        fmt.Println("不及格")
    }
}
  • else if 会依次检查条件,一旦某个条件为 true,对应的代码块会被执行,其后的条件将不再被检查。

2. 循环结构

Go的唯一循环结构是 for,它支持多种形式的使用方式:条件型循环、无限循环和基于范围的循环(range)。

条件型 for 循环

条件型循环与其他语言中的 while 循环类似,只要条件为 true,循环体就会被执行。

package main

import "fmt"

func main() {
    count := 1

    for count <= 5 {
        fmt.Println(count)
        count++
    }
}
无限循环

如果没有提供循环的条件表达式,for 会形成一个无限循环。

package main

import "fmt"

func main() {
    for {
        fmt.Println("无限循环")
    }
}

这种循环可以通过 break 语句跳出,或通过 return 提前结束。

range 遍历

Go支持通过 range 关键字遍历数组、切片、映射(map)和通道(channel)等集合。

package main

import "fmt"

func main() {
    numbers := []int{1, 2, 3, 4, 5}

    for index, value := range numbers {
        fmt.Printf("索引: %d, 值: %d\n", index, value)
    }
}
  • range 会返回每个元素的索引和值。
  • 你可以通过 _ 忽略不需要的返回值,比如只关心值而不关心索引。

3. switch 语句

Go的 switch 语句提供了一种多分支选择的方式,它不仅支持常规的值匹配,还支持表达式匹配。

多分支选择

switch 语句可以代替多层 if-else 判断,语法更为简洁。

package main

import "fmt"

func main() {
    day := 3

    switch day {
    case 1:
        fmt.Println("星期一")
    case 2:
        fmt.Println("星期二")
    case 3:
        fmt.Println("星期三")
    default:
        fmt.Println("其他")
    }
}
  • switch 默认只执行匹配的 case,并自动退出。
  • default 用于没有匹配到任何 case 时执行。
匹配表达式

Go的 switch 还支持更复杂的表达式匹配,而不仅限于常量比较。

package main

import "fmt"

func main() {
    number := 8

    switch {
    case number < 5:
        fmt.Println("小于 5")
    case number >= 5 && number <= 10:
        fmt.Println("在 5 到 10 之间")
    default:
        fmt.Println("大于 10")
    }
}
  • 这种模式类似于 else if,能够检查条件表达式,而不是具体值。
  • switch 语句也支持多个 case 值的组合。

4. 延迟执行的 defer

defer 语句用于延迟执行某个函数或语句,直到其外层函数返回时才会执行。常用于资源清理、文件关闭、锁的释放等场景。

package main

import "fmt"

func main() {
    fmt.Println("开始")

    defer fmt.Println("结束")  // 延迟执行

    fmt.Println("处理中...")
}

输出:

开始
处理中...
结束
  • defer 会在当前函数退出前执行,多个 defer 会按 后进先出 的顺序执行。

5. 错误处理机制:panicrecover

Go语言采用了一种轻量级的错误处理机制,使用 panic 触发异常,而通过 recover 来捕获并恢复异常。

panic

panic 用于终止程序的执行,并抛出一个错误信息。常用于程序遇到不可恢复的严重错误时。

package main

import "fmt"

func main() {
    fmt.Println("开始")

    panic("程序遇到严重错误")

    fmt.Println("这行不会被执行")
}

输出:

开始
panic: 程序遇到严重错误
  • panic 会立即停止当前函数的执行,并开始逐级向上返回,直到整个程序崩溃。
recover

recover 用于捕获 panic 导致的异常,避免程序崩溃。

package main

import "fmt"

func main() {
    defer func() {
        if r := recover(); r != nil {
            fmt.Println("捕获异常:", r)
        }
    }()

    panic("触发异常")
}

输出:

捕获异常: 触发异常
  • recover 只能在 defer 函数中调用,且必须在 panic 被触发之后才能捕获异常。
  • 如果没有 recoverpanic 将导致程序崩溃。

扩展阅读:


原文地址:https://blog.csdn.net/weixin_43215013/article/details/142878603

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!