流程控制
Go语言中有以下几种常见的流程控制语句:
-
条件语句(Conditional Statements):
if
语句:用于根据条件执行代码块。else
语句:在if
条件不满足时执行的语句块。else if
语句:用于在多个条件之间进行判断。
age := 20if 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 := 2switch 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 := 2switch 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 mainimport ("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 mainimport "fmt"func main() {defer fmt.Println("这行代码会最后执行")fmt.Println("这行代码会第一个执行") }
输出结果:
这行代码会第一个执行 这行代码会最后执行
defer
语句会将函数调用推迟到包含它的函数执行完毕后执行。defer
还可以用于关闭文件、释放锁、清理资源等操作,确保在函数结束时这些操作一定会执行,不受返回或错误的影响。