1.if-else-分支结构
- Go 语言中最常用的流程控制有 if 和 for
- switch 和 goto 主要是为了简化代码、降低重复代码而生的结构,属于扩展类的流程控制
1.1.if-条件判断基本写法
1.1.1.语法示例
# 标准分支
if 表达式1 {
分支1
} else if 表达式2 {
分支2
} else{
分支3
}
# 简化型分支
if 表达式1 {
分支1
}
1.1.2.语法说明
如果 表达式1 的结果为 true ,执行分支1;
否则判断 表达式2,如果满足则执行分支2;
前两个表达式都不满足时,则执行分支3,也就是默认条件下执行的操作
1.1.3.语法要求
1.判断语句关键字(if,else if 或者 else )的 左大括号{ 必须与关键字和判断表达式放在同一行,放在其他位置会触发编译错误
2.其他判断关键字(else if 和 else)必须放在上一个 判断关键字(if 或 else if)右大括号} 后面,且在同一行
3.if 判断中的其他判断关键字(else if 和 else)都是可选的,可以根据实际需要进行使用
1.2.if-条件判断特殊写法
- 可以在 if 表达式之前添加一个变量赋值语句,再根据变量值进行判断
1.3.if-条件判断的两种写法却别在哪
- 主要区别在于变量的作用域
- 标准写法,if 语句外面的变量定义可以用于多个 if 语句
- 特殊写法,if 语句里面的变量定义只能用于当前的 if 语句
1.4.实例演示
package main
import (
"fmt"
)
// if 条件判断
func ifDemo01() { // 标准写法
score := 65
if score >= 90 {
fmt.Println("A")
} else if score > 75 {
fmt.Println("B")
} else {
fmt.Println("C")
}
}
func ifDemo02() { // 特殊写法
if score := 65; score >= 90 {
fmt.Println("A")
} else if score > 75 {
fmt.Println("B")
} else {
fmt.Println("C")
}
}
// 以上两种写法的区别,变量的作用域问题 !!!
// if 语句外面的变量定义可以用于多个 if 语句
// if 语句里面的变量定义只能用于当前的 if 语句
func main() {
ifDemo01()
ifDemo02()
}
2.for-循环结构
- Go 语言中的所有循环类型均可以使用for关键字来完成
2.1.for-循环标准语法
- 注意:for 循环可以通过 break、goto、return、panic 语句强制退出循环
2.1.1.语法示例
for 初始语句;条件表达式;结束语句{
循环体语句
}
2.1.2.语法说明
- 条件表达式返回 true 时循环体不停地进行循环,直到条件表达式返回 false 时自动退出
- for 循环的初始语句可以被忽略,但是初始语句后的分号必须要写
- for 循环的初始语句和结束语句都可以省略
2.2.for-循环-无限循环-死循环
2.3.for...range-键值循环
- Go语言中可以使用 for range 遍历数组、切片、字符串、map 及通道(channel)
- 通过 for range 遍历的返回值有以下规律
1.数组、切片、字符串返回索引和值。
2.map返回键和值。
3.通道(channel)只返回通道内的值。
2.4.实例演示
package main
import (
"fmt"
)
// for 循环标准写法
func forDemo01() {
fmt.Printf("forDemo01\n")
for i := 0; i < 10; i++ {
fmt.Println(i)
}
}
// 省略初始语句的 for 循环写法
func forDemo02() {
fmt.Printf("forDemo02\n")
i := 0
for ; i < 10; i++ { // 简略写法
fmt.Println(i)
}
}
// 省略初始语句和结束语句的 for 循环写法
func forDemo03() {
fmt.Printf("forDemo03\n")
i := 0
for i < 10 { // 相当于其他语言的 while 语法
fmt.Println(i)
i++ // 写法相当于 i = i +1
}
}
// 无限循环-死循环
func forDemo04() {
for { // 啥也不写就是最简单的死循环,
// 实际测试这个死循环只会跑满单个 CPU 内核,推测是针对多核处理器跑死循环任务做了优化
} // 虽说如此,生产环境还是不建议测试这个死循环
}
func main() {
forDemo01()
forDemo02()
forDemo03()
forDemo04()
}
3.switch_case-循环语句
- switch 循环,相当于 if 条件判断的变种
- 使用 switch 语句可方便地对大量的值进行条件判断
3.1.switch-标准语法
3.1.1.语法示例
3.1.2.语法说明
- Go 语言规定,每个 switch 只能有一个 default 分支
- 一个分支可以有多个值,多个 case 值中间使用英文逗号分隔
- 分支可以使用表达式,这时候 switch 语句后面不需要再跟判断变量
3.2.fallthrouugh-语法
- fallthrough 语法用于执行满足条件的 case 的下一个 case 语句(仅下一个语句),是为了兼容 C语言 中的 case 设计的
3.3.实例演示
// Go 语言规定,每个 switch 只能有一个 default 分支
func switchDemo01() {
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("无效的输入!")
}
}
// 一个分支可以有多个值,多个 case 值中间使用英文逗号分隔
func switchDemo02() {
switch n := 7; n {
case 1, 3, 5, 7, 9:
fmt.Println("奇数")
case 2, 4, 6, 8:
fmt.Println("偶数")
default:
fmt.Println(n)
}
}
// 分支可以使用表达式,这时候 switch 语句后面不需要再跟判断变量
func switchDemo03() {
age := 30
switch {
case age < 25:
fmt.Println("好好学习吧")
case age > 25 && age < 35:
fmt.Println("好好工作吧")
case age > 60:
fmt.Println("好好享受吧")
default:
fmt.Println("活着真好")
}
}
// fallthrough 语法用于执行满足条件的 case 的下一个 case 语句(仅下一个语句),是为了兼容 C语言 中的 case 设计的
func switchDemo04() {
s := "a"
switch {
case s == "a":
fmt.Println("a")
fallthrough
case s == "b":
fmt.Println("b")
case s == "c":
fmt.Println("c")
default:
fmt.Println("...")
}
}
func main() {
switchDemo01()
switchDemo02()
switchDemo03()
switchDemo04()
}
4.GO-语言中的标签语法
4.1.break-退出循环语法
4.2.goto-标签语法-跳转到指定标签
- 可以实现跳出两层循环
- goto 语句通过标签进行代码间的无条件跳转
- goto 语句可以在快速跳出循环、避免重复退出上有一定的帮助
- Go 语言中使用 goto 语句能简化一些代码的实现过程,例如双层嵌套的 for 循环退出
4.3.break-标签语法-跳出循环
- break 语句可以结束 for、switch 和 select 的代码块
- GO 语言中 break 语句还可以在语句后面添加标签,表示退出某个标签对应的代码块
- break 标签要求必须定义在对应的 for、switch 和 select 的代码块之上
4.4.conitune-标签语法-继续下次循环
- continue 语句可以结束当前循环,开始下一次的循环迭代过程,仅限在 for 循环内使用
- 在 continue 语句后添加标签时,表示开始标签对应的循环
4.5.实例演示
package main
import "fmt"
// 一般的跳出两层循环,通过自定义标签跳出循环
func gotoDemo01() {
var breakFlag bool // 默认的初始化值 false
for i := 0; i < 5; i++ {
for j := 0; j < 5; j++ {
if i == 2 && j == 2 {
// 设置退出标签
breakFlag = true // 修改 breakFlag 的值为 true
break // 跳出 for 循环
// continue // 继续下一次循环
}
fmt.Printf("%v-%v\n", i, j)
}
// 外层 for 循环判断
if breakFlag { // 判断 breakFlag 的值为 true ,执行后续语句
fmt.Println("这是外层for循环")
break
}
}
fmt.Println("跳出两层循环-break通用语法")
}
// 使用 goto 简化跳出两层 for 循环的代码
// goto 语句通过标签进行代码间的无条件跳转
// goto 语句可以在快速跳出循环、避免重复退出上有一定的帮助
// Go 语言中使用 goto 语句能简化一些代码的实现过程,例如双层嵌套的 for 循环退出
func gotoDemo02() {
for i := 0; i < 5; i++ {
for j := 0; j < 5; j++ {
if j == 2 {
// 设置退出标签
goto breakTag // GO 语言标签的引用
}
fmt.Printf("%v-%v\n", i, j)
}
fmt.Println("这是外层for循环")
}
return
// 标签
breakTag: // GO 语言标签的定义
fmt.Println("跳出两层循环-goto标签语法")
}
// GO 语言中使用 break 跳出循环
// GO 语言中 break 语句可以结束 for、switch 和 select 的代码块
// GO 语言中 break 语句还可以在语句后面添加标签,表示退出某个标签对应的代码块
// break 标签要求必须定义在对应的 for、switch 和 select 的代码块之上
func breakDemo() {
BREAKDEMO1: // GO语言:定义一个 break 标签,用的不多,执行到此会把该标签后的 for循环 跳出,相当于跳出两层 for 循环
for i := 0; i < 5; i++ {
for j := 0; j < 5; j++ {
if j == 2 {
break BREAKDEMO1 // GO 语言标签的引用
}
fmt.Printf("%v-%v\n", i, j)
}
fmt.Println("这是外层for循环")
}
fmt.Println("跳出两层循环-break标签语法")
}
// GO 语言中使用 continue 实现继续下次循环
// continue 语句可以结束当前循环,开始下一次的循环迭代过程,仅限在 for 循环内使用
// 在 continue 语句后添加标签时,表示开始标签对应的循环
func continueDemo() {
forloop1: /// GO语言:定义一个 continue 标签,用的不多,执行到此会跳过本次循环,并转到标签位置,继续执行后续 for 循环
for i := 0; i < 5; i++ {
// forloop2:
for j := 0; j < 5; j++ {
if i == 2 && j == 2 {
continue forloop1 // GO 语言标签的引用
}
fmt.Printf("%v-%v\n", i, j)
}
fmt.Println("这是外层for循环")
}
fmt.Println("继续循环-continue标签语法")
}
func main() {
// gotoDemo01()
// gotoDemo02()
// breakDemo()
// continueDemo()
}
- 打印 99 乘法表
- 打印 200 到 300 以内的质数,只能被 1 和自己整除的整数
10.参考地址
https://www.liwenzhou.com/posts/Go/04_basic/
|
请发表评论