程序流程控制决定程序是如何执行的,程序控制语句一般包括:顺序、分支、循环
顺序控制
程序默认自上到下执行,中间不会跳转。
Golang中采用合法的前向引用,变量必须先定义后使用(部分语言中 支持 先试用 后定义,程序执行过程会自动优化)
分支控制
if分支控制
if支持单分支、双分支和多分支控制语法如下
基本语法
if 条件表达式1 {
执行代码块1
}else if 条件表达式2{
执行代码块2
}
....
else{
执行代码块3
}
当条件表达式1为 true时就就执行代码块1, 否则 判断 条件表达式2,如果为true 则执行代码块2 ,如果之前的表达式都为false,则执行代码块3
示例程序
func test6(){
var age int
fmt.Println("请输入年龄:")
fmt.Scanln(&age)
if(age>18){
fmt.Println("你是成年人")
}else if(age>0){
fmt.Println("你是未成年人")
}else{
fmt.Println("年龄不合法")
}
}
switch分支控制
基本语法
switch 表达式{
case 表达式1,表达式2...:
代码块1
case 表达式3,表达式4...:
代码块2
...
default:
代码块n
}
go中switch case 语句块中不用加 break,且 case 后的表达式可以有多个 用逗号分隔
示例代码
func test7(){
var age int
fmt.Println("请输入年龄:")
fmt.Scanln(&age)
switch age {
case 1,2,3,4,5,6:
fmt.Println("你是儿童")
case 7,8,9,10,11,12,13,14:
fmt.Println("你是少年")
default:
fmt.Println("你长大了")
}
switch {
case 0<age && age<=7:
fmt.Println("你是儿童")
case 7<age && age<=14:
fmt.Println("你是少年")
default:
fmt.Println("你长大了")
}
switch nage := age; {
case 0<nage && nage<=7:
fmt.Println("你是儿童")
//fallthrough switch 穿透
case 7<nage && nage<=14:
fmt.Println("你是少年")
default:
fmt.Println("你长大了")
}
var x interface{
}
var y = 10.0
x = y
switch i :=x.(type){
case nil:
fmt.Printf("x的类型是 : %T",i)
case int:
fmt.Printf("x的类型是 : int")
case float64:
fmt.Printf("x的类型是 : float64")
default:
fmt.Printf("x的类型是 未知类型")
}
}
注意点
- case/switch 后可以是一个变量、表达式、有返回值的函数都可以
- case 后的表达式取值的数据类型必须和switch后的表达式类型一致
- case 后如果是常量值则不能重复
- default不是必须的
- switch 后也可以不带表达式,类似if else 用法
- switch 后可以直接声明一个变量,分号结束 不推荐使用
- switch 穿透-fallthrough:如果在case 语句块后增加fallthrough 则会继续执行下一个case
- Type Switch :switch 语句可以用于type-switch 来判断 某个interface 变量执行的 变量类型
总结
如果判断的具体数值不多,而且符合整数、浮点数、字符、字符串这几种类型 建议使用switch,简介高效
其他情况:区间判断、结果为bool类型判断,使用if ,if 使用范围更广
循环控制
for循环控制
基本语法
for 循环变量初始化;循环条件;循环变量迭代{
循环操作(语句)
}
for ; ; {
//无限循环 通常配合break语句使用
//操作语句
}
for {
//无限循环 通常配合break语句使用
//操作语句
}
for index,val := range str{
//操作语句
}
代码示例
func test8(){
for i := 1;i < 10;i++{
fmt.Println("结果:",i)
}
fmt.Println("=====================")
var c int =1;
for {
fmt.Println("结果:",c)
c++
if(c>10){
break
}
}
fmt.Println("=====================")
var str string = "我爱北京天安门"
for i :=0 ; i<len(str); i++ {
fmt.Printf("%c \n",str[i])
}
fmt.Println("=====================")
for index,val := range str {
fmt.Printf("index =%d ,val=%c \n",index,val)
}
}
while 和 do while
Go语言没有while 和 do while 语法,可以使用for来实现同样的效果
代码示例
func test9(){
// ---------do while 效果实现
var c int =1
for {
fmt.Println("结果:",c)
c++
if(c>10){
break
}
}
// while 效果实现
for {
if(c>10){
break
}
fmt.Println("结果:",c)
c++
}
}
跳转控制语句 break continue goto return
Break
break用于中止某个语句块的执行,用于中断当前for循环或 switch语句
- 可以通过标签,指明要中止哪一层的for循环
- 默认跳出最近的for循环
continue
用于结束本次循环,直接开始下一次循环
多层循环嵌套时可以通过标签 指定跳过哪一层的循环
goto
- goto 可以无条件让程序转到指定位置执行
- 通常和条件语句配合使用,用来实现 条件转移和跳出循环等功能
- 一般不推荐使用goto,容易造成 程序流程混乱
return
用于跳出所在的方法或函数
示例代码
func test10(){
outf://增加标签
for i := 0;i<5;i++ {
inf:
for j :=0; j<5; j++ {
fmt.Println("i=",i,",j=",j);
if i == 1 && j == 2{
break inf //结束内存循环 外层循环继续执行 外层继续i =2 的循环
}
if i==3 {
continue outf
}
if i == 5 && j == 2{
// 输出 5 2 后外层循环中止,后续不在有输出
break outf //结束内存循环
}
}
}