这是我参与8月更文挑战的第3天,活动详情查看:8月更文挑战
我们接下来继续学习一下golang的分支语句,分支语句包括if语句,switch语句,select语句等,即通过条件判断进而选择执行哪部分逻辑。
程序的流程控制结构一共有三种:
顺序结构:从上向下,逐行执行。
选择结构:条件满足,某些代码才会执行。
分支语句:if,switch,select
循环结构:条件满足,某些代码会被反复的执行多次。
if语句
语法格式:
/*
单分支结构语法格式如下:
if 条件判断 {
//代码块
}
条件判断如果为真(true),那么就执行大括号中的代码块;如果为假(false),就不执行大括号中的代码块。
*/
代码示例:
func main() {
var score int
fmt.Printf("请输入你的分数:>>> ")
fmt.Scan(&score)
if score >= 60 {
fmt.Println("恭喜你,你已经及格了")
}
}
除了以上比较简单的单逻辑if判断还有以下几种:
if bool {
/* 在布尔表达式bool为 true 时执行 */
} else { //注意该位置的else不能换行
/* 在布尔表达式bool为 false 时执行 */
}
if bool {
/* 在布尔表达式bool为 true 时执行 */
} else if bool{
/* 在布尔表达式bool为 false ,布尔表达式bool为true时执行 */
} else{
/* 在上面两个布尔表达式都为false时,执行*/
}
在if语句中golang还支持if的几种变形,我们接下来看一下:
if statement; condition {
}
if condition{
}
来个例子:num的定义在if里,那么只能够在该if..else语句块中使用
func main() {
if num := 10; num % 2 == 0 {
fmt.Println(num,"is even")
} else {
fmt.Println(num,"is odd")
}
}
switch语句
switch是一个条件语句,它计算表达式并将其与可能匹配的列表进行比较,并根据匹配执行代码块。它可以被认为是一种惯用的方式来写多个if else子句。
switch 语句从上直下逐一测试,直到匹配为止。 switch 语句执行的过程从上至下,直到找到匹配项,匹配项后面也不需要再加break。Go里面switch默认相当于每个case最后带有break,匹配成功后不会自动向下执行其他case,而是跳出整个switch, 但是可以使用fallthrough强制执行后面的case代码。
如果switch没有表达式,它会匹配true,如果每个case表达式都被计算为true,那么就会执行相应的代码块。
switch var1 {
case val1:
...
case val2:
...
default:
...
}
var str = "hel
//基本用法
switch str {
case "good":
fmt.Println("Good morning")
case "hello":
fmt.Println("hello everyone")
default:
fmt.Println("。。。。")
}
fallthrough
如需贯通后续的case,就添加fallthrough
package main
import (
"fmt"
)
type data [2]int
func main() {
switch x := 5; x {
default:
fmt.Println(x)
case 5:
x += 10
fmt.Println(x)
fallthrough
case 6:
x += 20
fmt.Println(x)
}
}
运行结果:
15
35
switch的注意事项
- case后的常量值不能重复
- case后可以有多个常量值
- fallthrough应该是某个case的最后一行。如果它出现在中间的某个地方,编译器就会抛出错误。
Type Switch
switch 语句还可以被用于 type-switch 来判断某个 interface 变量中实际存储的变量类型。
switch x.(type){
case type:
statement(s);
case type:
statement(s);
default:
statement(s);
}
package main
import "fmt"
func main() {
var x interface{}
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("未知型")
}
}