go基础 | 青训营笔记

46 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 3 天

6、条件语句

语句描述
if 语句if 语句 由一个布尔表达式后紧跟一个或多个语句组成。
if...else 语句if 语句 后可以使用可选的 else 语句, else 语句中的表达式在布尔表达式为 false 时执行。
if 嵌套语句你可以在 ifelse if 语句中嵌入一个或多个 ifelse if 语句。
switch 语句switch 语句用于基于不同条件执行不同动作。
select 语句select 语句类似于 switch 语句,但是select会随机执行一个可运行的case。如果没有case可运行,它将阻塞,直到有case可运行。

注意:Go 没有三目运算符,所以不支持 ?: 形式的条件判断,go也没有while。

 使用 if else 判断一个数的大小:
 ​
 实例
 package main
 ​
 import "fmt"
 ​
 func main() {
    /* 局部变量定义 */
    var a int = 100;
  
    /* 判断布尔表达式 */
     if a < 20 { // 逻辑j()
        /* 如果条件为 true 则执行以下语句 */
        fmt.Printf("a 小于 20\n" );
    } else { // else 不能单独开一行 可能是为了规范吧
        /* 如果条件为 false 则执行以下语句 */
        fmt.Printf("a 不小于 20\n" );
    }
    fmt.Printf("a 的值为 : %d\n", a);
 }
 ​
 a 不小于 20
 a 的值为 : 100
 ​
 ​
 if ... else if ... else... 实例:
 ​
 package main
 ​
 import "fmt"
 ​
 func main() {
     var age int = 23
     if age == 25 {
         fmt.Println("true")
     } else if age < 25 {
         fmt.Println("too small")
     } else {
         fmt.Println("too big")
     }
 }
 switch
 switch 语句用于基于不同条件执行不同动作,每一个 case 分支都是唯一的,从上至下逐一测试,直到匹配为止。
 switch 语句执行的过程从上至下,直到找到匹配项,匹配项后面也不需要再加 break。
 switch 默认情况下 case 最后自带 break 语句,匹配成功后就不会执行其他 case,如果我们需要执行后面的 case,可以使用 fallthrough 。
 ​
 switch var1 {
     case val1:
         ...
     case val2:
         ...
     default: // 
         ...
 }
 ​
 变量 var1 可以是任何类型,而 val1 和 val2 则可以是同类型的任意值。类型不被局限于常量或整数,但必须是相同的类型;或者最终结果为相同类型的表达式。(必须相同类型与var1)
 您可以同时测试多个可能符合条件的值,使用逗号分割它们,例如:case val1, val2, val3。(可以一个case多个标识)
 ​
 实例
 package main
 ​
 import "fmt"
 ​
 func main() {
    /* 定义局部变量 */
    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 { // bool 的switch 不用写var1 依次判断是否位true 也是直走第一个true
       case grade == "A" :
          fmt.Printf("优秀!\n" )    
       case grade == "B", grade == "C" :
          fmt.Printf("良好\n" )      
       case grade == "D" :
          fmt.Printf("及格\n" )      
       case grade == "F":
          fmt.Printf("不及格\n" )
       default:
          fmt.Printf("差\n" );
    }
    fmt.Printf("你的等级是 %s\n", grade );      
 }
 ​
 ​
 ​
 Type Switch
 switch 语句还可以被用于 type-switch 来判断某个 interface 变量中实际存储的变量类型。
 Type Switch 语法格式如下:
 switch x.(type){
     case type:
        statement(s);      
     case type:
        statement(s); 
     /* 你可以定义任意个数的case */
     default: /* 可选 */
        statement(s);
 }
 实例
 package main
 ​
 import "fmt"
 ​
 func main() {
    var x interface{}
      
    switch i := x.(type) {
       case nil:  
          fmt.Printf(" x 的类型 :%T",i)   // x 的类型 :<nil>   %T 输出值类型    %v 默认值的string()    
       case int:  
          fmt.Printf("x 是 int 型")                      
       case float64:
          fmt.Printf("x 是 float64 型")          
       case func(int) float64:
          fmt.Printf("x 是 func(int) 型")                      
       case bool, string:
          fmt.Printf("x 是 bool 或 string 型" )      
       default:
          fmt.Printf("未知型")    
    }  
 }
 fallthrough  // 但是不可以用在Type Switch里(也可以用在正常的switch var{case val1...} 里)
 使用 fallthrough 会强制执行后面的 case 语句,fallthrough 不会判断下一条 case 的表达式结果是否为 true。
 并且可以使用if break  去中断
 ​
 ​
 package main
 ​
 import "fmt"
 ​
 func main() {
 ​
     switch {
     case false:
             fmt.Println("1、case 条件语句为 false")
             fallthrough
     case true:
             fmt.Println("2、case 条件语句为 true")
             fallthrough
     case false:
             fmt.Println("3、case 条件语句为 false")
             fallthrough
     case true:
             fmt.Println("4、case 条件语句为 true")
     case false:
             fmt.Println("5、case 条件语句为 false")
             fallthrough
     default:
             fmt.Println("6、默认 case")
     }
 }
 执行结果
 2case 条件语句为 true
 3case 条件语句为 false
 4case 条件语句为 true
 select
 select 是 Go 中的一个控制结构,类似于 switch 语句。
 select 语句只能用于通道操作,每个 case 必须是一个通道操作,要么是发送要么是接收。
 select 语句会监听所有指定的通道上的操作,一旦其中一个通道准备好就会执行相应的代码块。
 如果多个通道都准备好,那么 select 语句会随机选择一个通道执行。如果所有通道都没有准备好,那么执行 default 块中的代码。
 ​
 select {
   case <- channel1:
     // 执行的代码
   case value := <- channel2:
     // 执行的代码
   case channel3 <- value:
     // 执行的代码
 ​
     // 你可以定义任意数量的 case
 ​
   default:
     // 所有通道都没有准备好,执行的代码
 }
 ​
 以下描述了 select 语句的语法:
 ​
 每个 case 都必须是一个通道
 所有 channel 表达式都会被求值
 所有被发送的表达式都会被求值
 如果任意某个通道可以进行,它就执行,其他被忽略。
 如果有多个 case 都可以运行,select 会随机公平地选出一个执行,其他不会执行。
 否则:
 如果有 default 子句,则执行该语句。
 如果没有 default 子句,select 将阻塞,直到某个通道可以运行;Go 不会重新对 channel 或值进行求值。