分支语句
顺序结构的程序虽然能解决计算、输出等问题,但不能做判断再选择。对于要先做判断再选择的问题就要使用分支结构。
1.1、单分支语句
语法:
if 布尔表达式 { // 注意左花括号必须与表达式同行
/* 在布尔表达式为 true 时执行 */
}
var username,password string
fmt.Print("请输入用户名:")
fmt.Scanln(&username)
fmt.Println("username",username)
fmt.Print("请输入密码:")
fmt.Scanln(&password)
fmt.Println("password",password)
if username == "yuan" && password=="123"{
fmt.Println("登录成功!")
}
1.2、双分支语句
双分支语句顾名思义,二条分支二选一执行!
var age int
fmt.Println("请输入你的年龄:")
fmt.Scanln(&age)
if age >= 18 {
fmt.Println("恭喜,你已经成年,可以观看该影片!")
} else {
fmt.Println("抱歉,你还未成年,不宜观看该影片!")
}
var username,password string
fmt.Print("请输入用户名:")
fmt.Scanln(&username)
fmt.Println("username",username)
fmt.Print("请输入密码:")
fmt.Scanln(&password)
fmt.Println("password",password)
if username == "yuan" && password=="123"{
fmt.Println("登录成功!")
}else {
fmt.Println("用户名或者密码错误!")
}
1.3、if多分支语句
多分支即从比双分支更多的分支选择一支执行。
package main
import "fmt"
func main() {
var score int
fmt.Scanln(&score)
if score > 100 && score < 0 {
fmt.Println("输入数字应该在1-100之间")
} else if score > 90 {
fmt.Println("成绩优秀!")
} else if score > 80 {
fmt.Println("成绩良好!")
} else if score > 60 {
fmt.Println("成绩及格!")
} else {
fmt.Println("请输入一个数字!")
}
}
提示
不管多少条分支只能执行一条分支!
练习:根据用户输入的生日判断星座
var month, day int
fmt.Print("请输入生日的月和日:")
fmt.Scan(&month, &day)
var xingZuo string
if day < 1 || day > 31 {
fmt.Println("输入的日有问题")
os.Exit(0)
}
switch month {
case 1:
// 日判断
if day >= 1 && day <= 19 {
xingZuo = "摩羯座"
} else {
xingZuo = "水瓶座"
}
case 2:
// 日判断
if day >= 1 && day <= 18 {
xingZuo = "水瓶座"
} else {
xingZuo = "双鱼座"
}
case 3:
// 日判断
if day >= 1 && day <= 20 {
xingZuo = "双鱼座"
} else {
xingZuo = "白羊座"
}
case 4:
// 日判断
if day >= 1 && day <= 19 {
xingZuo = "白羊座"
} else {
xingZuo = "金牛座"
}
case 5:
// 日判断
if day >= 1 && day <= 20 {
xingZuo = "金牛座"
} else {
xingZuo = "双子座"
}
case 6:
// 日判断
if day >= 1 && day <= 21 {
xingZuo = "双子座"
} else {
xingZuo = "巨蟹座"
}
case 7:
// 日判断
if day >= 1 && day <= 22 {
xingZuo = "巨蟹座"
} else {
xingZuo = "狮子座"
}
case 8:
// 日判断
if day >= 1 && day <= 22 {
xingZuo = "狮子座"
} else {
xingZuo = "处女座"
}
case 9:
// 日判断
if day >= 1 && day <= 22 {
xingZuo = "处女座"
} else {
xingZuo = "天秤座"
}
case 10:
// 日判断
if day >= 1 && day <= 23 {
xingZuo = "天秤座"
} else {
xingZuo = "天蝎座"
}
case 11:
// 日判断
if day >= 1 && day <= 22 {
xingZuo = "天蝎座"
} else {
xingZuo = "射手座"
}
case 12:
// 日判断
if day >= 1 && day <= 21 {
xingZuo = "射手座"
} else {
xingZuo = "摩羯座"
}
default:
fmt.Println("输入的月份有问题")
}
fmt.Println("您的星座是:", xingZuo)
1.4、switch多分支语句
语法:
switch var {
case val1:
...
case val2:
...
default:
...
}
switch语句也是多分支选择语句,执行哪一代码块,取决于switch后的 值与哪一case值匹配成功,则执行该case后的代码块。
/*
给出如下选项,并根据选项进行效果展示:
输入1:则输出"普通攻击"
输入2:则输出"超级攻击"
输入3:则输出"使用道具"
输入3:则输出"逃跑"
*/
var choice int
fmt.Println("请输入选择:")
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("输入有误!")
}
提示
1、switch比if else更为简洁
提示
2、执行效率更高。switch...case会生成一个跳转表来指示实际的case分支的地址,而这个跳转表的索引号与switch变量的值是相等的。从而,switch...case不用像if...else那样遍历条件分支直到命中条件,而只需访问对应索引号的表项从而到达定位分支的目的。
提示
3、到底使用哪一个选择语句,代码环境有关,如果是范围取值,则使用if else语句更为快捷;如果是确定取值,则使用switch是更优方案。
switch同时支持多条件匹配:
switch{
case 1,2:
default:
}
提示
strconv.ParseBool() 源码查看
1.5、分支嵌套
// 分支嵌套
var user string
var pwd int
fmt.Printf("请输入用户名:")
fmt.Scanln(&user)
fmt.Printf("请输入密码:")
fmt.Scanln(&pwd)
if user == "yuan" && pwd==123{
var score int
fmt.Printf("请输入成绩:")
fmt.Scanln(&score)
if score >= 90 && score<=100 {
fmt.Println("成绩优秀!")
} else if score >= 80 {
fmt.Println("成绩良好!")
} else if score >= 60 {
fmt.Println("成绩及格")
} else {
fmt.Println("不及格!")
}
}else {
fmt.Println("用户名或者密码错误!")
}