程序是由语句构成,而流程控制语句 是用来控制程序中每条语句执行顺序的语句。可以通过控制语句实现更丰富的逻辑以及更强大的功能。几乎所有编程语言都有流程控制语句,功能也都基本相似。
其流程控制方式有
顺序结构,分支结构,循环结构
1、switch比if else更为简洁
2、执行效率更高。switch…case会生成一个跳转表来指示实际的case分支的地址,而这个跳转表的索引号与switch变量的值是相等的。从而,switch…case不用像if…else那样遍历条件分支直到命中条件,而只需访问对应索引号的表项从而到达定位分支的目的。
3、到底使用哪一个选择语句,代码环境有关,如果是范围取值,则使用if else语句更为快捷;如果是确定取值,则使用switch是更优方案。
package main
import (
"fmt"
"os"
)
func 第1个_流程控制() {
var username, password string
fmt.Print("请输入用户名:")
fmt.Scanln(&username)
fmt.Print("请输入密码:")
fmt.Scanln(&password)
if username == "root" && password == "123" {
fmt.Println("登录成功")
} else {
fmt.Println("登录失败")
}
}
func 第2个_流程控制() {
var age int
fmt.Print("请输入您的年龄:")
fmt.Scanln(&age)
if age >= 18 {
fmt.Print("恭喜你,成年了")
} else {
fmt.Print("你还是未成年")
}
}
func 第3个_if多分支() {
//不管多少条分支只能执行一条分支!
var score int
fmt.Print("请输入你的分数:")
fmt.Scanln(&score)
if score > 100 && score < 0 {
fmt.Print("请输入一个在0-100之间的数字")
} else if score >= 90 {
fmt.Print("成绩优秀")
} else if score >= 80 {
fmt.Print("成绩良好")
} else if score >= 60 {
fmt.Print("成绩合格")
} else {
fmt.Print("不合格")
}
}
func 第4个_switch() {
/**
1、switch比if else更为简洁
2、执行效率更高。switch…case会生成一个跳转表来指示实际的case分支的地址,
而这个跳转表的索引号与switch变量的值是相等的。从而,switch…case不用像if…else
那样遍历条件分支直到命中条件,而只需访问对应索引号的表项从而到达定位分支的目的。
3、到底使用哪一个选择语句,代码环境有关,如果是范围取值,则使用if else语句更为快捷;
如果是确定取值,则使用switch是更优方案。
*/
var choice int
fmt.Println("请输入选择")
fmt.Scan(&choice)
switch choice {
case 0:
fmt.Println("选择0")
break
case 1:
fmt.Println("选择1")
break
case 2, 3: //switch同时支持多条件匹配:
fmt.Println("选择2,3")
break
default:
fmt.Println("选择默认")
break
}
}
func 第5个_根据用户输入的生日判断星座() {
var month, day int
fmt.Print("请输入你的生日月份和日:")
fmt.Scan(&month, &day)
var star string
if day < 1 || day > 31 {
fmt.Println("输入参数错误")
os.Exit(-1)
}
switch month {
case 1:
if day >= 1 && day <= 19 {
star = "星座11"
} else {
star = "星座12"
}
break
case 2:
if day >= 1 && day <= 19 {
star = "星座21"
} else {
star = "星座22"
}
break
case 3:
if day >= 1 && day <= 19 {
star = "星座31"
} else {
star = "星座32"
}
break
case 4:
if day >= 1 && day <= 19 {
star = "星座41"
} else {
star = "星座42"
}
break
case 5:
if day >= 1 && day <= 19 {
star = "星座51"
} else {
star = "星座52"
}
break
case 6:
if day >= 1 && day <= 19 {
star = "星座61"
} else {
star = "星座62"
}
break
case 7:
if day >= 1 && day <= 19 {
star = "星座71"
} else {
star = "星座72"
}
break
case 8:
if day >= 1 && day <= 19 {
star = "星座81"
} else {
star = "星座82"
}
break
case 9:
if day >= 1 && day <= 19 {
star = "星座91"
} else {
star = "星座92"
}
break
case 10:
if day >= 1 && day <= 19 {
star = "星座101"
} else {
star = "星座102"
}
break
case 11:
if day >= 1 && day <= 19 {
star = "星座111"
} else {
star = "星座112"
}
break
case 12:
if day >= 1 && day <= 19 {
star = "星座121"
} else {
star = "星座122"
}
break
default:
fmt.Println("error")
break
}
fmt.Println("你的星座是:" + star)
}
func main() {
第5个_根据用户输入的生日判断星座()
}
for循环
原始for循环,通过关系表达式或逻辑表达式控制循环
for condition { }
简单循环案例:
count := 0 // 初始化语句
for count < 10 { // 条件判断
fmt.Println("hello yuan!")
count++ // 步进语句
}
fmt.Println("end")
count := 10 // 初始化语句
for count > 0 { // 条件判断
fmt.Println(count)
count-- // 步进语句
}
fmt.Println("end")
三要素for循环(核心)
将初始化语句、条件判断以及步进语句格式固定化的循环方式,本质上和上面的for循环没有区别。
for init;condition;post {
// 循环体语句
}
init: 初始化语句,一般为赋值表达式,给控制变量赋初值;
condition:条件判断,一般是关系表达式或逻辑表达式,循环控制条件;
post: 步进语句,一般为赋值表达式,给控制变量增量或减量。
for i := 1; i < 10; i++ {
fmt.Println(i)
}
执行流程(关键):
(1)初始语句
(2)条件判断,布尔值为真则执行一次循环体,为假则退出循环
(3)执行一次循环体语句结束后,再执行步进语句,然后回到步骤(2),依次循环
案例1:计算1-100的和
/* var s = 0
s += 1
s += 2
s += 3
s += 4
s += 5
s += 6
s += 7
s += 8
s += 9
s += 10
fmt.Println(s)*/
// 如果是1+2+3+....100呢?如何借助循环语法实现
var s = 0
for i := 1; i <= 100; i++ {
s += i
}
fmt.Println(s)
无限循环案例
// 循环中嵌入分支语句
func main() {
fmt.Printf(`
1、普通攻击
2、超级攻击
3、使用道具
4、逃跑
`)
for true {
var choice int
fmt.Printf("请输入选择:")
fmt.Scanln(&choice)
//fmt.Println(choice,reflect.TypeOf(choice))
switch choice {
case 1:
fmt.Println("普通攻击")
case 2:
fmt.Println("超级攻击")
case 3:
fmt.Println("使用道具")
case 4:
fmt.Println("逃跑")
default:
fmt.Println("输入有误!")
}
}
}
输入正整数num,大于100,则打印1-num,小于100,则打印num-1?
var num int
fmt.Scanln(&num)
if num > 100 {
for i := 1; i <= num; i++ {
fmt.Println(i)
}
} else {
for i := num; i > 0; i-- {
fmt.Println(i)
}
}
退出循环
如果想提前结束循环(在不满足结束条件的情况下结束循环),可以使用break或continue关键字。
break 用来跳出整个循环语句,也就是跳出所有的循环次数;
continue 用来跳出当次循环,也就是跳过当前的一次循环。
break语句
当 break 关键字用于 for 循环时,会终止循环而执行整个循环语句后面的代码。break 关键字通常和 if 语句一起使用,即满足某个条件时便跳出循环,继续执行循环语句下面的代码。
for i := 0; i < 10; i++ {
if i==8{
break
}
fmt.Println(":",i)
}
continue语句
break 语句使得循环语句还没有完全执行完就提前结束,与之相反,continue 语句并不终止当前的循环语句的执行,仅仅是终止当前循环变量 i 所控制的这一次循环,而继续执行该循环语句。continue 语句的实际含义是“忽略 continue 之后的所有循环体语句,回到循环的顶部并开始下一次循环”
for i := 0; i < 10; i++ {
if i==8{
continue
}
fmt.Println(":",i)
}
案例: 计算 1 - 2 + 3 - 4 + … + 99 中除了88以外所有数的总和?
在控制台上打印一个五行五列的矩形,如下图所示
for i := 0; i < 5; i++ {
for j:=0;j<5;j++ {
fmt.Print("*")
}
fmt.Print("\n")
}
在控制台上打印一个如下图所示的三角形
for i := 0; i < 5; i++ {
for j := 0; j <= i; j++ {
fmt.Printf("*")
}
fmt.Println()
}