【从零开始学习Go语言 | 第六篇】Go语言基础之流程控制
目录前言条件分支if基本用法if - elseif - else if - else带初始化语句的 if循环for完整 for 循环类似 C 语言的 for省略初始化语句和后置语句相当于 while无限循环键值循环for range分支选择switch基本 switch不带表达式的 switch代替 if-else 链fallthrough 关键字跳转goto循环控制break 和 continuebreak 示例continue 示例标签与 break/continue 配合总结前言欢迎回到我们的Go语言学习系列在前几篇文章中我们学习了变量、常量、基本数据类型和运算符。有了这些基础今天我们将进入一个更激动人心的主题——流程控制。流程控制是编程语言的核心它决定了程序的执行路径。通俗地说就是让程序能够根据不同的条件做出不同的反应或者重复执行某段代码。Go语言中的流程控制语句简洁而强大主要包括if、for、switch、goto以及用于循环控制的break和continue。让我们从最简单的开始。条件分支ifif语句用于根据布尔条件决定是否执行某段代码。Go 中的if不需要括号包裹条件但括号也可以使用并且必须写大括号{}。Go语言中if条件判断的格式如下if 表达式1 { 分支1 } else if 表达式2 { 分支2 } else{ 分支3 }当表达式1的结果为true时执行分支1否则判断表达式2如果满足则执行分支2都不满足时则执行分支3。 if判断中的else if和else都是可选的可以根据实际需要进行选择。注意这里有一点特殊Go语言规定与if匹配的左括号{必须与if和表达式放在同一行{放在其他位置会触发编译错误。 同理与else匹配的{也必须与else写在同一行else也必须与上一个if或else if右边的大括号在同一行。其它语言中这样写可能是对的但是在Go中下列写法会触发编译错误要小心if 表达式1 { 分支1 } else if 表达式2 { 分支2 } else{ 分支3 }基本用法package main import fmt func main() { score : 85 if score 60 { fmt.Println(及格了) } }if - elseif score 60 { fmt.Println(及格) } else { fmt.Println(不及格) }if - else if - elseif score 90 { fmt.Println(优秀) } else if score 75 { fmt.Println(良好) } else if score 60 { fmt.Println(及格) } else { fmt.Println(加油) }带初始化语句的 ifGo 允许在if条件之前执行一个简单的语句通常是变量声明该变量的作用域仅限于if-else块内部。if age : 18; age 18 { fmt.Println(成年了) } else { fmt.Println(未成年) } // 这里无法使用 age因为 age 只在 if-else 块内有效这种写法常用于获取可能出错的函数返回值在 Go 标准库中非常常见。循环forGo 语言没有while和do-while循环只有一个for关键字但它能实现所有循环场景。完整 for 循环类似 C 语言的 forfor 初始化语句; 条件表达式; 后置语句 { // 循环体 }示例打印 1 到 5for i : 1; i 5; i { fmt.Println(i) }省略初始化语句和后置语句相当于 whilesum : 1 for sum 1000 { sum sum } fmt.Println(sum) // 1024无限循环for { fmt.Println(无限循环按 CtrlC 退出) }for循环可以通过break、goto、return、panic语句强制退出循环。键值循环for rangeGo语言中可以使用for range遍历数组、切片、字符串、map 及通道channel。 通过for range遍历的返回值有以下规律数组、切片、字符串返回索引和值。map返回键和值。通道channel只返回通道内的值。Go1.22版本开始支持 for range 整数。// 遍历切片 nums : []int{2, 4, 6} for index, value : range nums { fmt.Printf(索引: %d, 值: %d\n, index, value) } // 输出 // 索引: 0, 值: 2 // 索引: 1, 值: 4 // 索引: 2, 值: 6 // 只需要值忽略索引 for _, value : range nums { fmt.Println(value) } // 输出 // 2 // 4 // 6 // 遍历字符串得到 Unicode 码点 str : Go语言 for i, ch : range str { fmt.Printf(%d %c\n, i, ch) } // 输出 // 0 G // 1 o // 2 语 // 3 言分支选择switchGo 的switch非常灵活比 C/Java 的更强大。每个case默认带有break不需要显式写break就能避免贯穿。而且case可以是任意类型不限于整数条件也可以是复杂表达式。使用switch语句可方便地对大量的值进行条件判断。基本 switchfunc switchDemo1() { finger : 3 switch finger { case 1: fmt.Println(大拇指) case 2: fmt.Println(食指) case 3: fmt.Println(中指) case 4: fmt.Println(无名指) case 5: fmt.Println(小拇指) default: fmt.Println(无效的输入) } }Go语言规定每个switch只能有一个default分支。一个分支可以有多个值多个case值中间使用英文逗号分隔。day : Saturday switch day { case Monday: fmt.Println(周一加油) case Tuesday, Wednesday, Thursday, Friday: // 多个条件共享一个分支 fmt.Println(工作日) case Saturday, Sunday: fmt.Println(周末放松一下) default: fmt.Println(未知) }不带表达式的 switch代替 if-else 链分支还可以使用表达式这时候switch语句后面不需要再跟判断变量。例如func switchDemo4() { age : 30 switch { case age 25: fmt.Println(好好学习吧) case age 25 age 35: fmt.Println(好好工作吧) case age 60: fmt.Println(好好享受吧) default: fmt.Println(活着真好) } }fallthrough 关键字Go 中默认不会贯穿到下一个case但如果需要可以使用fallthrough强制执行下一个case不管其条件是否满足。是为了兼容C语言中的case设计的。switch num : 2; num { case 1: fmt.Println(1) case 2: fmt.Println(2) fallthrough case 3: fmt.Println(3) // 由于 fallthrough这里也会执行 case 4: fmt.Println(4) }输出输出: 2 3跳转gotogoto可以无条件跳转到同一函数内的标签。虽然goto名声不好容易造成代码混乱但在某些场景如多层循环跳出、错误处理统一出口中使用得当可以简化代码。Go 中保留了goto但建议谨慎使用。func main() { fmt.Println(start) if true { goto LABEL } fmt.Println(这行不会打印) LABEL: fmt.Println(end) }一个更实际的例子跳出多层循环func main() { for i : 0; i 5; i { for j : 0; j 5; j { if i 2 j 2 { goto Out } fmt.Printf(i%d, j%d\n, i, j) } } Out: fmt.Println(跳出所有循环) }循环控制break 和 continuebreak 示例break用于终止当前循环最内层的for、switch或select。for i : 1; i 10; i { if i 5 { break // 当 i 等于 5 时跳出循环 } fmt.Print(i, ) } // 输出: 1 2 3 4continue 示例continue用于跳过本次循环的剩余代码直接进入下一次循环。for i : 1; i 5; i { if i%2 0 { continue // 偶数跳过不打印 } fmt.Print(i, ) } // 输出: 1 3 5标签与 break/continue 配合Go 中的break和continue可以指定标签从而跳出或继续到指定循环不仅仅是当前最内层。标签必须放在循环前面。OuterLoop: for i : 1; i 3; i { for j : 1; j 3; j { if i 2 j 2 { break OuterLoop // 跳出外层循环 } fmt.Printf((%d,%d) , i, j) } fmt.Println() } // 输出: // (1,1) (1,2) (1,3) // (2,1)同样continue OuterLoop会直接跳到外层循环的下一次迭代。OuterLoop: for i : 1; i 3; i { for j : 1; j 3; j { if i 2 j 2 { cotinue OuterLoop // 跳到外层循环的下一次迭代 } fmt.Printf((%d,%d) , i, j) } fmt.Println() } // 输出 // (1,1) (1,2) (1,3) // (2,1) (3,1) (3,2) (3,3)总结今天我们学习了 Go 语言中流程控制的全部核心内容if条件分支支持初始化语句。for唯一的循环关键字可以模拟while和无限循环range用于遍历集合。switch灵活的分支选择每个case自动 break可使用fallthrough强制贯穿。goto跳转到标签谨慎使用。break / continue控制循环的跳出与跳过可配合标签作用于外层循环。这些语句组合在一起可以构建出任何复杂的业务逻辑。掌握了它们你已经可以写出丰富多彩的 Go 程序了。下一篇文章我们将深入讲解 Go 语言的数组看看如何组织和复用代码。感谢阅读我们下篇再见如果我的内容对你有帮助请点赞评论收藏。创作不易大家的支持就是我坚持下去的动力