跳到主要内容

分支语句

顺序结构的程序虽然能解决计算、输出等问题,但不能做判断再选择。对于要先做判断再选择的问题就要使用分支结构。

1.1、单分支语句

语法:

if 布尔表达式 {  // 注意左花括号必须与表达式同行

/* 在布尔表达式为 true 时执行 */

}

image-20211216155050847

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、双分支语句

双分支语句顾名思义,二条分支二选一执行!

image-20210318171626403

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多分支语句

多分支即从比双分支更多的分支选择一支执行。

image-20210318173151614

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("请输入一个数字!")
}
}

提示

不管多少条分支只能执行一条分支!

练习:根据用户输入的生日判断星座

image-20220730142158298

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:
...
}

image-20210319120205199

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("用户名或者密码错误!")
}