Go基础:Go语言流程控制详解
文章目录
- 一、流程控制概述
- 二、条件语句
- 2.1 基本语法
- 2.2 特性
- 2.3 示例代码
- 2.4 switch 选择语句
- 三、循环语句
- 3.1 基本语法
- 3.2 特性
- 3.3 示例代码
- 四、跳转语句
- 4.1 基本语法
- 4.2 特性
- 4.3 示例代码
一、流程控制概述
Go 语言的流程控制是编写逻辑清晰、结构化程序的核心。流程控制语句用于控制程序的执行顺序,这样你的程序就具备了逻辑结构。一般流程控制语句需要和各种条件结合使用,比如用于条件判断的 if,用于选择的 switch,用于循环的 for 等。总结如下:
- 1. 条件语句:优先使用
if
的短声明特性,减少变量作用域。避免嵌套过深,必要时使用switch
语句替代。 - 2. 循环语句:使用
for
循环实现所有循环逻辑,保持代码风格统一。使用range
遍历集合类型,避免手动管理索引。 - 3. 跳转语句:谨慎使用
goto
,仅在必要时用于跳出复杂嵌套结构。优先使用break
和continue
控制循环流程。
以下从条件语句、循环语句和跳转语句三个方面,结合详细案例代码进行解析。
二、条件语句
if 语句是条件语句,它根据布尔值的表达式来决定选择哪个分支执行:如果表达式的值为 true,则 if 分支被执行;如果表达式的值为 false,则 else 分支被执行。
2.1 基本语法
Go 语言提供了 if
、if...else
和 if...else if...else
等条件语句,用于根据布尔表达式的结果执行不同的代码块。
2.2 特性
- 短声明:
if
语句支持在条件表达式中声明变量,这些变量的作用域仅限于if
代码块。 - 严格布尔判断:条件表达式必须返回布尔值,不支持隐式类型转换。
2.3 示例代码
package main
import "fmt"
func main() {// 基本条件判断x := 10if x > 5 {fmt.Println("x is greater than 5")} else {fmt.Println("x is not greater than 5")}// 带短声明的条件判断if num := 42; num%2 == 0 {fmt.Println(num, "is even")} else {fmt.Println(num, "is odd")}
}
输出:
x is greater than 5
42 is even
2.4 switch 选择语句
if 条件语句比较适合分支较少的情况,如果有很多分支的话,选择 switch 会更方便,使用 switch 的代码案例如下:
switch i:=6;{
case i>10:fmt.Println("i>10")
case i>5 && i<=10:fmt.Println("5<i<=10")
default:fmt.Println("i<=5")
}
switch 语句同样也可以用一个简单的语句来做初始化,同样也是用分号 ; 分隔。每一个 case 就是一个分支,分支条件为 true 该分支才会执行,而且 case 分支后的条件表达式也不用小括号 () 包裹。
在 Go 语言中,switch 的 case 从上到下逐一进行判断,一旦满足条件,立即执行对应的分支并返回,其余分支不再做判断。也就是说 Go 语言的 switch 在默认情况下,case 最后自带 break。这和其他编程语言不一样,比如 C 语言在 case 分支里必须要有明确的 break 才能退出一个 case。Go 语言的这种设计就是为了防止忘记写 break 时,下一个 case 被执行。
那么如果你真的有需要,的确需要执行下一个紧跟的 case 怎么办呢?Go 语言也考虑到了,提供了 fallthrough 关键字。现在看个例子,如下面的代码所示:
switch j:=1;j {
case 1:fallthrough
case 2:fmt.Println("1")
default:fmt.Println("没有匹配")
}
以上示例运行会输出 1,如果省略 case 1: 后面的 fallthrough,则不会有任何输出。
当 switch 之后有表达式时,case 后的值就要和这个表达式的结果类型相同,比如这里的 j 是 int 类型,那么 case 后就只能使用 int 类型,如示例中的 case 1、case 2。如果是其他类型,比如使用 case “a” ,会提示类型不匹配,无法编译通过。
而对于 switch 后省略表达式的情况,整个 switch 结构就和 if……else 条件语句等同了。
switch 后的表达式也没有太多限制,是一个合法的表达式即可,也不用一定要求是常量或者整数。你甚至可以像如下代码一样,直接把比较表达式放在 switch 之后:
switch 2>1 {
case true:fmt.Println("2>1")
case false:fmt.Println("2<=1")
}
可见 Go 语言的 switch 语句非常强大且灵活。
三、循环语句
在 Go 语言中没有 while 循环,但是可以通过 for 达到 while 的效果,Go 语言里的 for 循环非常强大。在 Go 语言中,支持使用 continue、break 控制 for 循环:
- continue 可以跳出本次循环,继续执行下一个循环。
- break 可以跳出整个 for 循环,哪怕 for 循环没有执行完,也会强制终止。
3.1 基本语法
Go 语言仅提供 for
循环,但通过不同形式实现了多种循环功能,包括传统 for
循环、无限循环和 range
循环。
3.2 特性
- 灵活性:
for
循环可以替代其他语言中的while
循环。 range
关键字:用于遍历数组、切片、字符串、映射和通道。
3.3 示例代码
package main
import "fmt"
func main() {// 传统 for 循环for i := 0; i < 5; i++ {fmt.Println("Iteration:", i)}// 无限循环count := 0for {fmt.Println("Infinite loop")count++if count >= 3 {break}}// range 循环遍历字符串str := "Hello, Go"for index, char := range str {fmt.Printf("Index: %d, Character: %c\n", index, char)}
}
输出:
Iteration: 0
Iteration: 1
Iteration: 2
Iteration: 3
Iteration: 4
Infinite loop
Infinite loop
Infinite loop
Index: 0, Character: H
Index: 1, Character: e
Index: 2, Character: l
Index: 3, Character: l
Index: 4, Character: o
Index: 5, Character: ,
Index: 6, Character:
Index: 7, Character: G
Index: 8, Character: o
四、跳转语句
4.1 基本语法
Go 语言提供了 break
、continue
和 goto
三种跳转语句,用于控制程序的执行流程。
4.2 特性
break
:用于终止当前循环或switch
语句。continue
:跳过当前循环的剩余部分,直接进入下一次循环。goto
:跳转到指定标签,适用于需要跳出多层嵌套结构的场景。
4.3 示例代码
package main
import "fmt"
func main() {// break 示例for i := 0; i < 5; i++ {if i == 3 {break}fmt.Println("Break example:", i)}// continue 示例for i := 0; i < 5; i++ {if i == 2 {continue}fmt.Println("Continue example:", i)}// goto 示例for i := 0; i < 5; i++ {if i == 3 {goto Exit}fmt.Println("Goto example:", i)}
Exit:fmt.Println("Exited loop")
}
输出:
Break example: 0
Break example: 1
Break example: 2
Continue example: 0
Continue example: 1
Continue example: 3
Continue example: 4
Goto example: 0
Goto example: 1
Goto example: 2
Exited loop
通过掌握以上流程控制语句及其特性,可以编写出逻辑清晰、结构高效的 Go 语言程序。