Go语言基础03(程序流程控制)

Go语言基础03(程序流程控制)

Go语言基础(程序流程控制)


  \ \quad  在程序中,程序运行的流程控制决定了程序是如何执行的,主流的程序设计语言一般有三大流程控制语句:分别是 顺序控制分支控制循环控制

  \ \quad  Go语言的常用流程控制有ifforswitchgoto

一、顺序控制

1.1 顺序控制介绍

  \ \quad  所谓的顺序控制就是程序从上到下逐行的执行,中间没有任何判断和跳转。

1.2 流程图

Go语言基础03(程序流程控制)

1.3 顺序控制举例和注意事项

  • Golang中定义变量时要采用合法的前向引用。如:
    func main() {
    	var num1 int = 10 // 声明 num1
    	var num2 int = num1 + 20 // 使用 num1
    	fmt.Println(num2)
    }
    
    错误形式:不可以先使用变量后声明
    func main() {
    	var num2 int = num1 + 20 // 使用 num1
    	var num1 int = 10 // 声明 num1
    	fmt.Println(num2)
    }
    

二、分支控制

  \ \quad  在实际应用中,有时需要通过某个判断来决定任务是否执行或者执行的方式。对于这样的情况,仅有顺序结构控制是不够的,需要选择结构,也就是分支控制语句。

  \ \quad  所谓的分支控制就是让程序执行到某个位置的时候有一个判断,判断结果为布尔值,如果布尔值为true则执行某一块代码,布尔值为false则执行另一块代码。分支控制主要有三种形式:单分支、双分支和多分支。

2.1 单分支结构

  • 若条件成立时需要执行某些操作,不成立时不执行操作,则需要编写单分支结构。
  • Golang中的if语句实现了单分支控制结构,用来实现有条件地执行语句的功能。
  • if语句单分支结构的语法形式如下,当条件判断表达式为true时,就会执行{ }的代码,如果为false则不执行。
    if condition {
    	/* 在条件判断表达式为 true 时执行 */
    }
    
    • if:条件判断使用的关键字。
    • condition:条件判断表达式。
  • Go语言中的if语句后面的条件判断表达式,不需要也不能加小括号,即(),这是Go语言与其他语言if语句的区别。
  • Go语言if语句后面的大括号必须跟条件表达式写在一行,不能换行写,换行写会编译错误。
  • Go语言if语句{ }是必须有的,就算只写一行代码也必须加上。
  • Goif还有一个强大的地方就是判断条件语句里面允许声明一个变量,这个变量的作用域只能在该条件逻辑块内,其他地方就不起作用了。
  • 单分支结构流程图:
Go语言基础03(程序流程控制)
  • 示例:判断年龄是否成年
    func main() {
    	age := 20
    	if age > 18 {
    		fmt.Println("您已经成年")
    	}
    }
    
    • 条件判断语句里面声明变量
      func main() {
      	if age := 20; age >= 18 {
      		fmt.Println("您已经成年")
      	}
      }
      

2.2 双分支结构

  • 若条件成立时需要执行某些操作,不成立时需要执行另外一些操作,则需要编写双分支结构。
  • Go语言中,关键字else是用于在if条件不满足时执行的代码逻辑。else后面一定不能加判断条件,否则会语法错误。
  • Go编程语言中if...else语句的语法如下if在条件判断表达式为true时,其后紧跟的语句块执行,如果为false则执行else语句块。
    if condition {
    	/* 在条件判断表达式为 true 时执行 */
    } else {
    	/* 在条件判断表达式为 false 时执行 */
    }
    
    • if:条件判断使用的关键字。
    • condition:条件判断表达式。
  • 双分支结构流程图:
Go语言基础03(程序流程控制)
  • 示例:判断年龄是否成年,如果未成年则输出年龄
    func main() {
    	if age := 16; age > 18 {
    		fmt.Println("您已经成年")
    	} else {
    		fmt.Printf("%d岁还未成年", age)
    	}
    }
    

2.3 多分支结构

2.3.1 if … else if 分支控制

  • 若条件成立时需要执行某些操作,不成立时需要执行后续多个逻辑判断,直到满足条件时执行某些操作,则需要编写多分支结构。
  • Go语言中,关键字if是用于测试某个条件(布尔型逻辑型)的语句是否满足一定的条件,如果满足特定的条件,则会执行if后由大括号{ }括起来的代码块,否则就忽略该代码块继续执行后续的代码。
  • else if关键字用于在if语句条件不满足的情况下,继续执行else if里面的逻辑判断,如果满足条件则执行else if大括号里面的逻辑。
  • else if语句只能写在if语句的大括号的后面,且else if语句可以写任意多个。
  • Go编程语言中if ... else if语句的语法如下if在条件判断表达式为true时,其后紧跟的语句块执行,如果为false则执行后续多个else if语句块,直到else if的条件判断表达式为true时执行紧跟的语句块。
    if condition {
    	// do something
    } else if condition1 {
    	// do something1
    } else if condition2 {
    	// do something2
    }
    	...... 
    	
    } else if conditionN {
    	// do somethingN
    }
    
    • Go语言中的else if语句后面的条件判断表达式,同样也不需要加小括号,即(),类似于if语句。同理,Go语言else if语句后面的大括号必须跟else if条件表达式写在一行,不能换行写,换行写会编译错误。
    • 上述语句,如果if语句的条件表达式成立,那么就会只执行if的逻辑do something,如果if条件表达式不成立,那么会判断表达式condition1
    • 如果表达式condition1成立,那么会执行do something1,仅仅在表达式condition1不成立时,才会判断表达式condition2,如果表达式condition2成立,那么执行do something2,否则,继续向后执行直到条件判断表达式成立。如果所有条件判断表达式均不成立,则执行else代码块。
  • 多分支结构流程图:
    Go语言基础03(程序流程控制)
  • 示例:判断考试成绩等级
    func main() {
    	var score float64
    	fmt.Print("请输入成绩:")
    	fmt.Scanf("%f", &score)
    	if score >= 90 {
    		fmt.Printf("%.2f分是A等", score)
    	} else if score >= 80 {
    		fmt.Printf("%.2f分是B等", score)
    	} else if score >= 70 {
    		fmt.Printf("%.2f分是C等", score)
    	} else if score >= 60 {
    		fmt.Printf("%.2f分是D等", score)
    	} else {
    		fmt.Printf("%.2f分是E等", score)
    	}
    }
    

2.3.2 switch 语句

  • switch语句的作用类似于if语句,用于基于不同条件执行不同动作,每一个case分支都是唯一的,从上至下逐一测试,直到匹配为止。
  • Go语言的switch语句不同于其他语言的switch语句,Go语言的switch语句的表达式不需要为常量,且匹配项后面也不需要再加break语句case语句最后自带break语句。
  • switch默认情况下case最后自带break语句,匹配成功后就不会执行其他 case,如果我们需要执行后面的 case,可以使用 fallthrough 。
  • Go编程语言中switch语句的语法如下
    switch var1 {
    	case val2:
    		...
    	case val3:
    		...
    	......
    	case valN:
    		...
    	default:
    		...
    }
    
    • switch:判断使用的关键字。
    • var1:需要判断的变量或条件表达式。
    • case:每一个分支前面需要使用的关键字。
    • var2:判断var1是否满足var2的条件。
    • varN:判断var1是否满足varN的条件。
    • default:如果var1不满足上述所有的case,则会执行default分支。
    • :变量var1可以是任何数据类型,而 val1val2 则可以是同类型的任意值。类型不被局限于常量或整数,但必须是相同的类型,或者最终结果为相同类型的表达式。
  • 可以同时测试多个可能符合条件的值,使用逗号分割它们,例如:case val1, val2, val3
    func main() {
    	// 请用户输入年份,再输入月份,输出该月的天数(需要考虑闰年)
    	var year int
    	var month int
    	fmt.Print("请输入年份:")
    	fmt.Scanf("%d\n", &year)
    	fmt.Print("请输入月份:")
    	fmt.Scanf("%d\n", &month)
    	switch month {
    	case 1, 3, 5, 7, 8, 10, 12:
    		fmt.Printf("%d年%d月有31天", year, month)
    	case 4, 6, 9, 11:
    		fmt.Printf("%d年%d月有30天", year, month)
    	case 2:
    		if year%400 == 0 || year%4 == 0 && year%100 != 0 {
    			fmt.Printf("%d年%d月有29天", year, month)
    		} else {
    			fmt.Printf("%d年%d月有28天", year, month)
    		}
    	default:
    		fmt.Printf("%d年%d月不是一个正确的年月", year, month)
    	}
    }
    
  • switch语句流程图:
    Go语言基础03(程序流程控制)
  • 使用fallthrough会强制执行后面的case语句,fallthrough不会判断下一条case的表达式结果是否为 true
    func main() {
    	// 请用户输入年份,再输入月份,输出该月的天数(需要考虑闰年)
    	var year int
    	var month int
    	fmt.Print("请输入年份:")
    	fmt.Scanf("%d\n", &year)
    	fmt.Print("请输入月份:")
    	fmt.Scanf("%d\n", &month)
    	switch month {
    	case 1,3,5,7,8,10,12:
    		fmt.Printf("%d年%d月有31天", year, month)
    	case 4:
    		fallthrough
    	case 6:
    		fallthrough
    	case 9:
    		fallthrough
    	case 11:
    		fmt.Printf("%d年%d月有30天", year, month)
    	case 2:
    		if year%400 == 0 || year%4 == 0 && year%100 != 0 {
    			fmt.Printf("%d年%d月有29天", year, month)
    		} else {
    			fmt.Printf("%d年%d月有28天", year, month)
    		}
    	default:
    		fmt.Printf("%d年%d月不是一个正确的年月", year, month)
    	}
    }
    
上一篇:JAVA学习日志—基础语法03


下一篇:JavaScript 高级篇-03 (this指向/上下文执行模式/递归/闭包)