Go语言 流程控制

  • 决策

    决策结构要求程序员指定一个或多个要由程序评估或测试的条件,以及确定该条件为真的情况下要执行的一条或多条语句,以及指定该条件时要执行的其他语句(可选)确定为假。下面显示的是大多数编程语言中常见的典型决策结构的一般形式-
    c decision_making
    Go 编程语言将任何非零非null值假定为true,并且如果它为null,则将其假定为false值。
    Go 编程语言提供以下类型的决策语句。
    声明 描述
    if声明 一个if语句包含一个布尔表达式后跟一个或多个语句。
    if...else声明 一个if语句可以跟着一个可选的else语句,当布尔表达式是假的,其执行。
    嵌套if语句 您可以在另一个if or else if语句中使用一个if or else if语句。
    switch语句 switch语句允许一个变量来针对值的列表平等进行测试。
    嵌套的switch语句 您可以在另一个switch语句中使用一个switch语句。
    select语句 select语句与switch语句类似,区别在于case语句指的是信道通信。
    范例 - if声明
    condition1
    
    package main
    
    import "fmt"
    
    func main() {
       /* local variable definition */
       var a int = 10
     
       /* check the boolean condition using if statement */
       if( a < 20 ) {
          /* if condition is true then print the following */
          fmt.Printf("a is less than 20\n" )
       }
       fmt.Printf("value of a is : %d\n", a)
    }
    
    尝试一下
    范例 - if...else声明
    condition1
    
    package main
    
    import "fmt"
    
    func main() {
       /* local variable definition */
       var a int = 100;
     
       /* check the boolean condition */
       if( a < 20 ) {
          /* if condition is true then print the following */
          fmt.Printf("a is less than 20\n" );
       } else {
          /* if condition is false then print the following */
          fmt.Printf("a is not less than 20\n" );
       }
       fmt.Printf("value of a is : %d\n", a);
    }
    
    尝试一下
    范例 - 嵌套if语句
    
    package main
    
    import "fmt"
    
    func main() {
       /* local variable definition */
       var a int = 100
       var b int = 200
     
       /* check the boolean condition */
       if( a == 100 ) {
          /* if condition is true then check the following */
          if( b == 200 )  {
             /* if condition is true then print the following */
             fmt.Printf("Value of a is 100 and b is 200\n" );
          }
       }
       fmt.Printf("Exact value of a is : %d\n", a );
       fmt.Printf("Exact value of b is : %d\n", b );
    }
    
    尝试一下
    范例 - switch语句
    condition1
    以下规则适用于switch语句
    • switch语句中使用的表达式必须具有整数或枚举类型,或者是类类型,其中该类具有到整数或枚举类型的单个转换函数。
    • switch内可以有任意数量的case语句。每个case后面都跟要比较的值和一个冒号。
    • case的常量表达式必须与switch中的变量具有相同的数据类型,并且必须是常量或文字。
    • 当switch的变量等于case时,该case之后的语句将一直执行,直到到达break语句为止。
    • 当到达break声明,switch终止,并且控制流程跳转到以下switch语句中的下一行。
    • 并非每个case都需要break一下。直到达到switch最后的case如果没有switch的值出现控制流会落空。
    • 一个switch语句可以有一个可选的默认情况下,它必须出现在switch的最后。当所有情况都不为真时,可以使用默认情况来执行任务。在默认情况下,无需break。
    
    package main
    
    import "fmt"
    
    func main() {
       /* local variable definition */
       var grade string = "B"
       var marks int = 90
    
       switch marks {
          case 90: grade = "A"
          case 80: grade = "B"
          case 50,60,70 : grade = "C"
          default: grade = "D"  
       }
       switch {
          case grade == "A" :
             fmt.Printf("Excellent!\n" )     
          case grade == "B", grade == "C" :
             fmt.Printf("Well done\n" )      
          case grade == "D" :
             fmt.Printf("You passed\n" )      
          case grade == "F":
             fmt.Printf("Better try again\n" )
          default:
             fmt.Printf("Invalid grade\n" );
       }
       fmt.Printf("Your grade is  %s\n", grade );      
    }
    
    尝试一下
    范例 - select语句
    以下规则适用于select语句
    • 一个select可以包含任意数量的case语句。每个case后面都跟要比较的值和一个冒号。
    • case的类型必须是通信通道操作。
    • 发生通道操作时,将执行该情况后的语句。case语句中不需要中断。
    • 一个select语句可以有一个可选的default情况下,它必须出现在select结束。当所有情况都不为真时,可将default情况用于执行任务。在default情况下,无需break。
    
    package main
    
    import "fmt"
    
    func main() {
       var c1, c2, c3 chan int
       var i1, i2 int
       select {
          case i1 = <-c1:
             fmt.Printf("received ", i1, " from c1\n")
          case c2 <- i2:
             fmt.Printf("sent ", i2, " to c2\n")
          case i3, ok := (<-c3):  // same as: i3, ok := <-c3
             if ok {
                fmt.Printf("received ", i3, " from c3\n")
             } else {
                fmt.Printf("c3 is closed\n")
             }
          default:
             fmt.Printf("no communication\n")
       }    
    } 
    
    尝试一下