04 程序流程控制


程序流程控制决定程序是如何执行的,程序控制语句一般包括:顺序、分支、循环

顺序控制

程序默认自上到下执行,中间不会跳转。
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的类型是 未知类型")
   } 
}

注意点

  1. case/switch 后可以是一个变量、表达式、有返回值的函数都可以
  2. case 后的表达式取值的数据类型必须和switch后的表达式类型一致
  3. case 后如果是常量值则不能重复
  4. default不是必须的
  5. switch 后也可以不带表达式,类似if else 用法
  6. switch 后可以直接声明一个变量,分号结束 不推荐使用
  7. switch 穿透-fallthrough:如果在case 语句块后增加fallthrough 则会继续执行下一个case
  8. 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语句

  1. 可以通过标签,指明要中止哪一层的for循环
  2. 默认跳出最近的for循环

continue
用于结束本次循环,直接开始下一次循环
多层循环嵌套时可以通过标签 指定跳过哪一层的循环

goto

  1. goto 可以无条件让程序转到指定位置执行
  2. 通常和条件语句配合使用,用来实现 条件转移和跳出循环等功能
  3. 一般不推荐使用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 //结束内存循环
			}
			   
		}
	}
	

猜你喜欢

转载自blog.csdn.net/zhangxm_qz/article/details/114385412