欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 艺术 > Go语言中的控制结构(四)

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

2024/10/24 20:22:43 来源:https://blog.csdn.net/weixin_43215013/article/details/142878603  浏览:    关键词:Go语言中的控制结构(四)

Go语言中的控制结构详解

在这里插入图片描述

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

1. 条件语句

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

if 和 else 的使用

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

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

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

package mainimport "fmt"func main() {score := 85if 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 mainimport "fmt"func main() {count := 1for count <= 5 {fmt.Println(count)count++}
}
无限循环

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

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

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

range 遍历

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

package mainimport "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 mainimport "fmt"func main() {day := 3switch day {case 1:fmt.Println("星期一")case 2:fmt.Println("星期二")case 3:fmt.Println("星期三")default:fmt.Println("其他")}
}
  • switch 默认只执行匹配的 case,并自动退出。
  • default 用于没有匹配到任何 case 时执行。
匹配表达式

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

package mainimport "fmt"func main() {number := 8switch {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 mainimport "fmt"func main() {fmt.Println("开始")defer fmt.Println("结束")  // 延迟执行fmt.Println("处理中...")
}

输出:

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

5. 错误处理机制:panicrecover

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

panic

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

package mainimport "fmt"func main() {fmt.Println("开始")panic("程序遇到严重错误")fmt.Println("这行不会被执行")
}

输出:

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

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

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

输出:

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

扩展阅读:

  • Go语言官方文档
  • Effective Go
  • Go by Example - 通过实例学习Go

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com