go 流程控制-分支

流程控制介绍

在程序中,程序运行得流程控制决定程序是如何执行的,主要有三大流程控制语句

  • 顺序控制
  • 分支控制
  • 循环控制

顺序控制

程序从上到下逐行地执行

在这里插入图片描述

分支控制

分支控制是让程序有选择的执行,有三种形式

  • 单分支
  • 双分支
  • 多分支

单分支

语法

if 表达式 {
    执行代码块
}

说明: 当表达式的值为true时,执行{}中的代码
{}是必须有的

在这里插入图片描述

func main()  {
	var age int
	fmt.Println("请输入年龄: ")
	fmt.Scanln(&age)

	if age > 18 {
		fmt.Println("你的年龄大于18,要对自己的行为负责!")
	}
}
    // golang支持在if中,直接定义一个变量
	if age := 20; age > 18 {
		fmt.Println("你的年龄大于18,要对自己的行为负责!")
	}

双分支

语法

if 表达式 {
    代码块1
} else {
    代码块2
}

说明: 当表达式成立,执行代码块1,否则执行代码块2. {} 是必须有的

在这里插入图片描述

func main()  {
	var age int
	fmt.Println("请输入年龄: ")
	fmt.Scanln(&age)

	if  age > 18 {
		fmt.Println("你的年龄大于18,要对自己的行为负责!")
	} else {
		fmt.Println("你的年龄不大,这次放过你")
	}
}
func main()  {
	var x int = 4
	var y int = 1
	if (x > 2) {
		if (y > 2) {
			fmt.Println(x+y)
		}
			fmt.Println("atguigu")
	} else {
		fmt.Println("x is =", x)
	}
}

编写程序,声明2个int32型变量并赋值.判断两数之和,如果大于等于50,打印"hello world!"

func main()  {
	var n1 int32 = 30
	var n2 int32 = 40
	if n1 + n2 > 50 {
		fmt.Println("hello world!")
	}
}

编写程序,声明2个float64型变量并赋值.判断第一个数大于10.0, 且第二个数小于20.0,打印两数之和

func main()  {
	var n1 float64 = 13.2
	var n2 float64 = 15.4
	if n1 > 10.0 && n2 < 20.0 {
		fmt.Println(n1 + n2)
	}
}

定义两个变量int32, 判断两者的和,是否能被3又能被5整除,打印提示信息

func main()  {
	var num1 int32 = 11
	var num2 int32 = 20
	if (num1 + num2) % 3 == 0 && (num1 + num2) % 5 ==0  {
		fmt.Println("能被3又能被5整除")
	}
}

判断一个年份是否是闰年,闰年的条件是符合下面二者之一:(1)年份能被4整除,但不能被100整除; (2)能被400整除

func main()  {
	var year int = 2000
	if  (year % 4 == 0 && year % 100 != 0) || year % 400 == 0 {
		fmt.Printf("%d是闰年!", year)
	}
}

多分支

只有一个分支的代码块会执行

语法

if 表达式1 {
	代码块1
} else if 表达式2 {
	代码块2
}
...
else {
	代码块n
}

在这里插入图片描述

package main

import "fmt"

func main()  {
	var score int
	fmt.Println("请输入成绩:")
	fmt.Scanln(&score)
	if score == 100 {
		fmt.Println("优秀")
	} else if score > 80 && score <= 99 {
		fmt.Println("良好")
	} else if score >=60 && score <= 80 {
		fmt.Println("合格")
	} else {
		fmt.Println("不合格")
	}
}
func main()  {
	var n int = 10
	if n > 9 {
		fmt.Println("ok1")
	} else if n > 6 {
		fmt.Println("ok2")
	} else if n > 3 {
		fmt.Println("ok3")
	} else {
		fmt.Println("ok4")
	}
}

运行结果

ok1

注: if的表达式不能是赋值语句

求ax^2+bx+c=0 方程的根. a,b,c分别为函数的参数,如果:b2-4ac>0,则有两个解;b2-4ac=0,则有一个解; b^2-4ac<0,则无解
x1=(-b+sqrt(b^2-4ac))/2a
x2=(-b-sqrt(b^2-4ac))/2a

package main

import (
	"fmt"
	"math"
)

func main()  {
	var a float64 = 3
	var b float64 = 100
	var c float64 = 6
	m := b * b - 4 * a * c

	if m > 0 {
		x1 := (-b + math.Sqrt(m))/ 2 * a
		x2 := (-b - math.Sqrt(m))/ 2 * a
		fmt.Printf("x1=%v, x2=%v", x1, x2)
	} else if m == 0 {
		x1 := (-b + math.Sqrt(m))/ 2 * a
		fmt.Printf("x1=%v", x1)
	} else {
		fmt.Println("无解")
	}
}

嵌套分支

在一个分支结构中又完整的嵌套了另一个完整的分支结构,里面的分支的结构称为内层分支,外面的分支结构称为外层分支

语法

if 表达式 {
	if 表达式 {
	} else {
	}
}

说明: 嵌套分支不宜过多,建议控制在3层内

package main

import "fmt"

func main()  {
	var second float64
	fmt.Println("请输入秒数:")
	fmt.Scanln(&second)

	if second <= 8 {
		var gender string
		fmt.Println("请输入性别:")
		fmt.Scanln(&gender)
		if gender == "男" {
			fmt.Println("进入决赛男子组")
		} else {
			fmt.Println("进入决赛女子组")
		}
	} else {
		fmt.Println("out...")
	}
}

出票系统: 根据淡旺季的月份和年龄,打印票价
旺季(4-10月):
成人(18-60): 60
儿童(<18): 半价
老人(>60): 1/3价
淡季:
成人: 40
其他: 20

package main

import (
	"fmt"
)

func main()  {
	var month byte
	var age byte
	var price float64 = 60.0

	fmt.Println("请输入月份:")
	fmt.Scanln(&month)
	fmt.Println("请输入年龄:")
	fmt.Scanln(&age)

	if month >= 4 && month <= 10 {
		if age >= 18 && age <= 60 {
			fmt.Printf("月份是 %v, 年龄是 %v, 票价是 %v", month, age, price)
		} else if age < 18 {
			price = price / 2
			fmt.Printf("月份是 %v, 年龄是 %v, 票价是 %v", month, age, price)
		} else {
			price = price / 3
			fmt.Printf("月份是 %v, 年龄是 %v, 票价是 %v", month, age, price)
		}
	} else {
		if age >= 18 && age <= 60 {
			price = 40
			fmt.Printf("月份是 %v, 年龄是 %v, 票价是 %v", month, age, price)
		} else {
			price = 20
			fmt.Printf("月份是 %v, 年龄是 %v, 票价是 %v", month, age, price)
		}
	}
}

switch分支控制

switch语句用于基于不同条件执行不同动作,每一个case分支都是唯一的,从上到下逐一测试,直到匹配为止.

语法

switch 表达式 {
	case 表达式1,表达式2,...:
		语句块1
	case 表达式3,表达式4,...:
		语句块2
	...
	default:
		语句块
}

在这里插入图片描述
说明:

  • switch的执行流程,先执行表达式,得到值,然后和case的表达式进行比较,如果相等,就匹配到,然后执行对应的case的语句块,然后退出switch
  • 如果switch的表达式的值没有和任何的case表达式匹配成功,则执行default的语句块,执行后退出switch
  • golang的case后的表达式可以有多个,使用逗号间隔.
func main()  {
	var key byte
	fmt.Println("请输入一个字符: ")
	fmt.Scanf("%c",&key)

	switch key {
	case 'a':
		fmt.Println("周一")
	case 'b':
		fmt.Println("周二")
	case 'c':
		fmt.Println("周三")
	case 'd':
		fmt.Println("周三")
	case 'e':
		fmt.Println("周四")
	case 'f':
		fmt.Println("周五")
	case 'g':
		fmt.Println("周六")
	case 'h':
		fmt.Println("周日")
	default:
		fmt.Println("输入有误...")
	}
}

switch的使用的注意事项

  • case/switch后是一个表达式(即:常量值,变量,一个有返回值的函数等都可以)
package main

import (
	"fmt"
)

func test(char byte) byte  {
	return char + 1
}

func main()  {
	var key byte
	fmt.Println("请输入一个字符: ")
	fmt.Scanf("%c",&key)

	switch test(key) + 1 {
	case 'a':
		fmt.Println("周一")
	case 'b':
		fmt.Println("周二")
	case 'c':
		fmt.Println("周三")
	case 'd':
		fmt.Println("周三")
	case 'e':
		fmt.Println("周四")
	case 'f':
		fmt.Println("周五")
	case 'g':
		fmt.Println("周六")
	case 'h':
		fmt.Println("周日")
	default:
		fmt.Println("输入有误...")
	}
}
  • case后的各个表达式的值的数据类型,必须和switch的表达式数据类型一致

  • case后面可以带多个表达式,使用逗号间隔

func main()  {
	var n1 int32 = 5
	var n2 int32 = 20

	switch n1 {
	case n2, 10, 5:
		fmt.Println("ok1")
	case 30, 50:
		fmt.Println("ok2")
	default:
		fmt.Println("没有匹配到")
	}
}
  • case后面的表达式如果是常量值(字面量),则要求不能重复

在这里插入图片描述

  • 程序匹配到一个case后就会执行对应的代码块,然后退出switch,如果一个都匹配不到,则执行default
  • default语句不是必须的
  • switch后也可以不带表达式,类似if-else分支来使用
func main()  {
	var age int = 10

	switch  {
	case age == 10:
		fmt.Println("age == ", age)
	case age == 20:
		fmt.Println("age == ", age)
	default:
		fmt.Println("没有匹配到")
	}

	var score int = 90
	switch  {
	case score > 90:
		fmt.Println("优秀")
	case score >= 70 && score <= 90:
		fmt.Println("良好")
	case score >= 60 && score < 70:
		fmt.Println("及格")
	default:
		fmt.Println("不及格")
	}
}
  • switch后也可以直接声明/定义一个变量,分号结束,不推荐.

在这里插入图片描述

  • switch穿透-fallthrough,如果在case语句块后增加fallthrough,则会继续执行下一个case,也叫switch穿透
func main()  {
	var num int = 10

	switch num {
	case 10:
		fmt.Println("ok1")
		fallthrough //默认只能穿透一层
	case 20:
		fmt.Println("ok2")
		fallthrough
	case 30:
		fmt.Println("ok3")
	case 40:
		fmt.Println("ok4")
	default:
		fmt.Println("没有匹配到...")
	}
}

运行结果

ok1
ok2
ok3
  • Type Switch: switch语句还可以被用于 type-switch来判断某个interface变量中实际指向的变量类型
func main()  {
	var x interface{}
	var y = 10.0
	x = y
	switch i := x.(type) {
	case nil:
		fmt.Printf("x的类型 : %T", i)
	case int:
		fmt.Printf("x 是 int 型")
	case float64:
		fmt.Printf("x 是 float64 型")
	case func(int) float64:
		fmt.Printf("x 是func(int) 型")
	case bool, string:
		fmt.Printf("x 是 bool 或 string 型")
	default:
		fmt.Printf("未知型")
	}
}

运行结果

x 是 float64 型

使用switch把小写类型的char型转为大写(键盘输入).只转换a,b,c.其它的输出"other".

func main()  {
	var char byte
	fmt.Println("请输入一个大写字母: ")
	fmt.Scanf("%c", &char)

	switch char {
	case 'a':
		fmt.Println("A")
	case 'b':
		fmt.Println("B")
	case 'c':
		fmt.Println("C")
	default:
		fmt.Println("other")
	}
}

对学生成绩大于60分的,输出"及格".低于60分的,输出"不及格"

func main()  {
	var score byte
	fmt.Println("请输入成绩: ")
	fmt.Scanln(&score)

	switch  {
	case score >= 60:
		fmt.Println("及格")
	case score < 60:
		fmt.Println("不及格")
	default:
		fmt.Println("输入有误...")
	}
}
func main()  {
	var score byte
	fmt.Println("请输入成绩: ")
	fmt.Scanln(&score)

	switch int(score / 60) {
	case 1:
		fmt.Println("及格")
	case 0:
		fmt.Println("不及格")
	default:
		fmt.Println("输入有误...")
	}
}

根据用户指定月份,打印该月份所属的季节.3,4,5 春季 6,7,8 夏季 9,10,11 秋季 12,1,2 冬季

func main()  {
	var month byte
	fmt.Println("请输入月份: ")
	fmt.Scanln(&month)

	switch month {
	case 3, 4, 5:
		fmt.Println("春季")
	case 6, 7, 8:
		fmt.Println("夏季")
	case 9, 10, 11:
		fmt.Println("秋季")
	case 12, 1, 2:
		fmt.Println("冬季")
	default:
		fmt.Println("输入有误...")
	}
}

switch和if的比较

  • 如果判断的具体数值不多,而且符合整数,浮点数,字符,字符串这几种类型.建议使用switch语句
  • 其它情况: 对区间判断和结果为bool类型的判断,使用if
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wuxingge

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值