Go语言入门-流程控制(for、switch、select、range、break、goto、continue)
目录
条件语句
-
if语句
if语句语法
if bool表达式 { //左花括号必须跟随bool表达式
//当bool表达式为true是执行。
Todo....
}
示例如下:
package main
func main() {
a := 10
if a >= 10 {
println("a 大于等于10") //10
}
if a < b100 {
println("a小于等于100") //100
}
}
/**
output:
a 大于等于10
a小于等于100
*/
if...else 语法
if bool表达式1 {
Todo..分支1
} else if bool表达式2 {
Todo..分支2
} else{
Todo..分支3
}
示例如下:
//获取绩效等级
func getPerformanceLevel(score int) {
if score > 120 {
fmt.Println("怕是要上天")
} else if score > 100 {
fmt.Println("超越")
} else if score >= 90 {
fmt.Println("优秀")
} else if score >= 80 {
fmt.Println("良好")
} else if score >= 60 {
fmt.Println("合格")
} else {
fmt.Println("卷铺盖走人吧")
}
}
func main() {
score1 := 300
score2 := 110
score3 := 95
score4 := 81
score5 := 61
score6 := 50
getPerformanceLevel(score1)
getPerformanceLevel(score2)
getPerformanceLevel(score3)
getPerformanceLevel(score4)
getPerformanceLevel(score5)
getPerformanceLevel(score6)
}
/**
output:
怕是要上天
超越
优秀
良好
合格
卷铺盖走人吧
*/
if 初始化语句
func main() {
if a := 10; a > 0 {
fmt.Println("if初始化测试")
}
}
/**
output:
if初始化测试
*/
以上例子中定义了局部变量a,局部变量a的作用域为整个if else语句块。这一点区别于C、C++、Java语言。
备注:Go语言中不支持三元操作符(三目运算符) "a > b ? a : b"。
-
switch语句
“ Switch”语句提供分支执行功能。 将表达式或类型说明符与“ switch”中的“ case”表达式进行比较,以确定要执行的分支。也就是说switch分为两类,第一类是 基于表达式选择的switch语句,第二类是基于类型选择的switch语句。
表达式switch语句语法
switch expr { //expr 表达式
case var1: Todo1 //expr表达式的值同var1进行比较,如果相等 执行Todo1语句并且退出switch
case var2: Todo2 //expr表达式的值同var2进行比较,如果相等 执行Todo2语句并且退出switch
case var3: Todo3 //expr表达式的值同var3进行比较,如果相等 执行Todo3语句并且退出switch
default: Todo4 //expr表达式的值都不满足case语句后面表达式的值 则会执行default
}
//分支使用表达式,类似于if else
switch { //无表达式
case expr1: Todo1 //expr表达式为true 执行Todo1语句并且退出switch
case expr2: Todo2 //expr表达式为true 执行Todo3语句并且退出switch
case expr3: Todo3 //expr表达式为true 执行Todo3语句并且退出switch
default: Todo4 //以上case都不满足时, 执行Todo4语句并且退出switch
}
通过以上可以看出是与C语言、C++、Java是不一样的,执行了某一条case语句以后实际上不需要再次break主动退出switch语句。
示例如下
func getWeekDay(day int) {
switch day {
case 7 :
fmt.Println("周 日")
case 6:
fmt.Println("周", day)
case 5:
fmt.Println("周", day)
case 4:
fmt.Println("周", day)
case 3:
fmt.Println("周", day)
case 2:
fmt.Println("周", day)
case 1:
fmt.Println("周", day)
default:
fmt.Println("ERROR")
}
}
func main() {
for i := 0; i < 9; i++ {
getWeekDay(i)
}
}
/**
ouput:
ERROR
周 1
周 2
周 3
周 4
周 5
周 6
周 日
ERROR
*/
由此可以看出,switch后跟表达式语句时,更加适用与某些点固定值的分支执行。ifelse适用与某些段的分支执行,当然两种也可以互相转换。那么switch能够模拟if ... else按段执行吗?答案是可以的。可以使用switch { case expr:...}的方式进行处理。如下:
//用switch改造if...else
//获取绩效等级
func getPerformanceLevelBySwitch(score int) {
switch {
case score > 120:
fmt.Println("怕是要上天")
case score > 100:
fmt.Println("超越")
case score >= 90:
fmt.Println("优秀")
case score >= 80:
fmt.Println("良好")
case score >= 60:
fmt.Println("合格")
default:
fmt.Println("卷铺盖走人吧")
}
}
func main() {
score1 := 300
score2 := 110
score3 := 95
score4 := 81
score5 := 61
score6 := 50
getPerformanceLevelBySwitch(score1)
getPerformanceLevelBySwitch(score2)
getPerformanceLevelBySwitch(score3)
getPerformanceLevelBySwitch(score4)
getPerformanceLevelBySwitch(score5)
getPerformanceLevelBySwitch(score6)
}
/**
output:
怕是要上天
超越
优秀
良好
合格
卷铺盖走人吧
*/
以上例子通过switch后面无表达式的方式,通过case关键字后增加bool表达式来判断是否执行case语句。从而达到模拟if...else进行数据分段的逻辑判断。
该用法为go语言特殊用法
类型switch语句语法
switch 语句还可以被用于 type-switch 来判断某个 interface 变量中实际存储的变量类型如下:
func typeSwitchDemo(x interface{}) {
switch x.(type) {
case nil:
fmt.Println("nil")
case int:
fmt.Println("int")
case float64:
fmt.Println("float64")
case bool, string:
fmt.Println("bool or string")
default:
fmt.Println("no found Type")
}
}
func main() {
var a1 chan int
a2 := 1
a3 := 1.0
a4 := true
a5 := "dsfsd"
typeSwitchDemo(a1) //no found Type
typeSwitchDemo(nil) //nil
typeS