流程控制
Go语言中有以下几种常见的流程控制语句:
-
条件语句(Conditional Statements):
if
语句:用于根据条件执行代码块。else
语句:在if
条件不满足时执行的语句块。else if
语句:用于在多个条件之间进行判断。
age := 20 if age >= 18 { fmt.Println("成年人") } else { fmt.Println("未成年人") } score := 85 if score >= 90 { fmt.Println("优秀") } else if score >= 80 { fmt.Println("良好") } else { fmt.Println("及格") }
-
循环语句(Loop Statements):
for
循环:用于重复执行一段代码块,可以指定循环条件、初始语句和后续语句。range
循环:用于遍历数组、切片、字符串、映射等数据结构中的元素。
// for循环 for i := 1; i <= 5; i++ { fmt.Println(i) } //for遍历string str := "hello,nihao" fmt.Println(str) fmt.Println("字符串str长度为:", len(str)) for i := 0; i < len(str); i++ { //fmt.Printf("字节打印:", str[i]) //直接打印是字符的编码 fmt.Printf("%c", str[i]) } // range循环 numbers := []int{1, 2, 3, 4, 5} for index, value := range numbers { fmt.Printf("索引:%d,值:%d\n", index, value) } //range遍历string for i, v := range str { fmt.Printf("索引位置:%d的值为:%c\n", i, v)//索引位置:0的值为:h }
-
选择语句(Selection Statements):
switch
语句:根据表达式的值选择执行不同的分支。
num := 2 switch num { case 1: fmt.Println("选择了1") case 2: fmt.Println("选择了2") default: fmt.Println("未知选择") } fruit := "apple" switch fruit { case "apple", "pear": fmt.Println("选择了苹果或梨子") case "banana": fmt.Println("选择了香蕉") default: fmt.Println("未知选择") }
-
跳转语句(Jump Statements):
break
语句:用于跳出当前循环或switch
语句。continue
语句:用于跳过当前循环的剩余代码并开始下一次迭代。goto
语句:无条件地转移到指定标签的语句。
for i := 1; i <= 5; i++ { if i == 3 { break // 当i等于3时跳出循环 } fmt.Println(i) // 1 2 } for i := 1; i <= 5; i++ { if i == 3 { continue // 当i等于3时跳过本次循环,继续下一次循环 } fmt.Println(i) //1 2 4 5 } i := 0 Loop: for { i++ if i == 3 { goto Loop // 跳转到Loop标签处继续执行循环 } else if i == 5 { break Loop // 在第5次循环时跳出循环 } fmt.Println(i)//1 2 4 }
除了上述常见的流程控制语句,Go语言还提供了一些其他的关键字和语句来处理程序的流程控制,如:
-
fallthrough
:在switch
语句中,用于贯穿到下一个分支的代码块。默认情况下,当一个分支的条件满足时,
switch
语句会执行该分支并终止,不会继续执行其他分支。但是,如果在某个分支使用了fallthrough
关键字,那么即使该分支的条件满足,程序也会继续执行下一个分支,无论下一个分支的条件是否满足。num := 2 switch num { case 1: fmt.Println("数字是1") case 2: fmt.Println("数字是2") fallthrough case 3: fmt.Println("数字是3") default: fmt.Println("未知数字") }
输出结果:
数字是2 数字是3
-
select
:用于在多个通道操作中进行选择和执行。select
语句用于在多个通道操作中进行选择和执行。它类似于switch
语句,但是针对通道操作。select
语句会监听多个通道的操作,一旦有某个通道操作可以进行,就会执行对应的代码块。package main import ( "fmt" "time" ) func main() { ch1 := make(chan string) ch2 := make(chan string) go func() { time.Sleep(2 * time.Second) ch1 <- "Hello from channel 1" }() go func() { time.Sleep(1 * time.Second) ch2 <- "Hello from channel 2" }() select { case msg1 := <-ch1: fmt.Println(msg1) case msg2 := <-ch2: fmt.Println(msg2) } }
输出结果:
Hello from channel 2
因为ch2通道的操作先准备好了,所以程序执行对应的代码块。
-
defer
:用于延迟执行函数调用,通常用于释放资源或错误处理。defer
用于延迟执行函数调用,通常用于释放资源或错误处理。被defer
关键字修饰的函数调用会在包含它的函数执行完毕后才执行,即使函数发生了错误也会执行。示例代码:
goCopy Codepackage main import "fmt" func main() { defer fmt.Println("这行代码会最后执行") fmt.Println("这行代码会第一个执行") }
输出结果:
这行代码会第一个执行 这行代码会最后执行
defer
语句会将函数调用推迟到包含它的函数执行完毕后执行。defer
还可以用于关闭文件、释放锁、清理资源等操作,确保在函数结束时这些操作一定会执行,不受返回或错误的影响。