3.1.4 使用if 嵌套语句
在Go程序中,可以在 if 或 else if 语句中嵌入使用一个或多个 if 或 else if 语句。具体语法格式如下:
if 布尔表达式 1 {
//在布尔表达式 1 为 true 时执行
if 布尔表达式 2 {
//在布尔表达式 2 为 true 时执行
}
}
实例3-4:智能密码锁系统(源码路径:Go-codes\3\pass.go)
小区内某业主新安装了智能防盗门,提供了一套智能密码锁系统保护家庭安全。假设业主设置的正确密码是“88888888”,请编写程序模拟智能密码系统的运作流程。实例文件pass.go的具体实现代码如下所示。
package main
import"fmt"
func main(){
var a int
var b int
fmt.Printf("请输入密码:\n") //提示业主输入密码
fmt.Scan(&a) //获取业主输入的密码
if a == 88888888 { //如果业主第一次输入的密码是“88888888”
fmt.Printf("请再次输入密码:") //提示业主再次输入密码
fmt.Scan(&b)
if b == 88888888 { //如果业主第二次输入的密码是“88888888”
fmt.Printf("密码正确,门锁已打开") //打印输出密码正确的提示
}else{ //如果业主第二次输入的密码不是“88888888”
fmt.Printf("非法入侵,已自动报警") //打印输出非法入侵的提示
}
}else{ //如果业主第一次输入的密码不是“88888888”
fmt.Printf("非法入侵,已自动报警") //打印输出非法入侵的提示
}
}
执行本实例,在输入正确密码“88888888”后会输出:
请输入密码:
88888888
请再次输入密码:88888888
密码正确,门锁已打开
3.1.5 使用switch 语句
虽然使用if…else if…else语句可以对多种情况进行判断,但是,该类语句在判断某些问题时,必须按顺序编写每个else if语句,书写会比较麻烦。为此,Go语言提供了另外一个语句来更好的实现多分支语句的判别——switch语句。和嵌套if或多个else if 语句相比,switch语句更加直观,并且更加容易理解。
在Go程序中,switch语句能够对某个条件进行多次判断,具体语法格式如下:
switch var1 {
case 条件1:
代码块1
case 条件2:
代码块2
default:
代码块N
}
对上述格式的具体说明如下:
(1)“var1”、“条件1”和“条件2”可以是同类型的任意值。类型不被局限于常量或整数,但必须是相同的类型,或者最终结果为相同类型的表达式。
(2)“var1”可以省略不写。
(3)可以同时测试多个可能符合条件的值,使用逗号分割它们,例如:
case val1, val2, val3
(4)如果满足“条件1”则执行后面对应的“代码块1”, 如果满足“条件2”则执行后面对应的“代码块2”,如果都不满足,则执行default后面的“代码块N”。
switch语句的执行流程如图3-4所示。
图3-4 switch语句的执行流程
实例3-5:成绩评测系统(源码路径:Go-codes\3\dengji.go)
用变量marks表示某同学的考试成绩,请使用switch语句判断这名同学的成绩等级:
- marks<60:E,不及格
- 60<=marks<70:D,及格
- 70<=marks<80:C,良好
- 80<=marks<90:B,优秀
- 90<=marks<=100:A,完美
实例文件dengji.go的具体实现代码如下所示。
package main
import "fmt"
func main() {
var marks int = 70 //变量marks表示某同学的考试成绩,赋值70
switch {
case marks>=90 : //如果成绩大于等于90
fmt.Printf("A:完美!\n" )
case marks>=80 : //如果成绩大于等于80
fmt.Printf("B:优秀\n" )
case marks>=70 : //如果成绩大于等于70
fmt.Printf("C:良好\n" )
case marks>=60 : //如果成绩大于等于60
fmt.Printf("D:及格\n" )
default: //如果不满足上面的成绩范围
fmt.Printf("E:差,不及格\n" );
}
}
执行后会输出:
C:良好
在Go程序中,还可以使用switch 语句的type-switch用法,用于判断某个interface变量中实际存储的变量的类型。type-switch用法的语法格式如下:
switch x.(type){
case type:
statement(s);
case type:
statement(s);
//可以定义任意个数的case
default: //可选
statement(s);
}
请看下面的实例文件type.go,能够打印输出变量x的类型。
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("未知型")
}
}
执行后会输出:
x 的类型 :<nil>
在Go语言中,case 是一个独立的代码块,执行完毕后不会像C语言那样紧接着执行下一个 case,但是为了兼容一些移植代码,依然加入了关键字fallthrough来实现这一功能。请看下面的实例文件chuan.go,演示了使用关键字fallthrough调整case语句的用法。
package main
import "fmt"
func main() {
switch {
case false:
fmt.Println("1、case 条件语句为 false")
fallthrough
case true:
fmt.Println("2、case 条件语句为 true")
fallthrough
case false:
fmt.Println("3、case 条件语句为 false")
fallthrough
case true:
fmt.Println("4、case 条件语句为 true")
case false:
fmt.Println("5、case 条件语句为 false")
fallthrough
default:
fmt.Println("6、默认 case")
}
}
在上述代码中,使用 fallthrough 会强制执行后面的 case 语句,fallthrough 不会判断下一条 case 的表达式结果是否为 true。执行后会输出:
2、case 条件语句为 true
3、case 条件语句为 false
4、case 条件语句为 true