[Go语言入门] 05 Go语言分支语句

本文详细介绍了Go语言中的分支控制结构,包括if语句的单分支、双分支和多分支形式,以及初始化if的用法。接着讨论了switch语句的使用,包括其基本语法、特性、类型判断以及无需break的特点。最后提到了select语句,它是Go语言特有的并发控制结构,通常与通道操作结合使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

05 Go语言分支语句

5.1 if 语句

单分支 if 语句

语法格式:

if 布尔表达式 {
  /* 在布尔表达式为 true 时执行 */
}

实例:

package main

import "fmt"

func main() {
   /* 定义局部变量 */
   var a int = 10
 
   /* 使用 if 语句判断布尔表达式 */
   if a < 20 {
       /* 如果条件为 true 则执行以下语句 */
       fmt.Printf("a 小于 20\n" )
   }
   fmt.Printf("a 的值为 : %d\n", a)
}

双分支 if 语句

语法格式:

if 布尔表达式 {
  /* 在布尔表达式为 true 时执行 */
} else {
  /* 在布尔表达式为 false 时执行 */
}

实例:

package main

import "fmt"

func main() {
   /* 局部变量定义 */
   var a int = 100;
 
   /* 判断布尔表达式 */
   if a < 20 {
       /* 如果条件为 true 则执行以下语句 */
       fmt.Printf("a 小于 20\n" );
   } else {
       /* 如果条件为 false 则执行以下语句 */
       fmt.Printf("a 不小于 20\n" );
   }
   fmt.Printf("a 的值为 : %d\n", a);

}

多分支 if 语句

语法格式:

if 布尔表达式 1 {
  /* 在布尔表达式1为true时执行 */
} else if 布尔表达式2 {
  /* 在布尔表达式1为false,布尔表达式2为true时执行 */
} else if 布尔表达式3 {
  /* 在前面的布尔表达式都为false,布尔表达式3为true时执行 */
} else if ... { // 可出现N多个else if
  
} else {
  /* 在前面所有的布尔表达式都为false时执行 */
}

实例:

package main
  
import "fmt"
func main() {
    num := 9
    if num < 0 {
        fmt.Println(num, "is negative")
    } else if num < 10 {
        fmt.Println(num, "has 1 digit")
    } else {
        fmt.Println(num, "has multiple digits")
    }
}

if 语句的初始化

if语句还可以有一个初始化式,初始化式在if语句的所有分支判断之前执行。

语法格式:

if 初始化式; 布尔表达式1 {
} else if 布尔表达式2 {
} else {
}

实例:

package main

import "fmt"

func aaaa() {
  fmt.Println("aaaa")
}

func bbbb() int {
  fmt.Println("bbbb")
  return 20
}

func main() {
  num := 5
  if aaaa(); num < bbbb() {
    fmt.Println("cccc <")
  } else if num > 0 {
    fmt.Println("cccc >")
  } else {
    fmt.Println("cccc ==")
  }
}

if语句的初始化表达式中还可以声明变量,这个变量的作用域只在该if语句的逻辑块中。

package main
  
import "fmt"
func main() {
    if num := 9; num < 0 {
        fmt.Println(num, "is negative")
    } else if num < 10 {
        fmt.Println(num, "has 1 digit")
    } else {
        fmt.Println(num, "has multiple digits")
    }
}

if 语句格式注意事项
  1. 不需要使用括号将条件包含起来
  2. 每个分支的大括号{}必须存在,即使只有一行语句
  3. 左括号必须在if或else的同一行

5.2 switch 语句

switch语句基于不同的条件执行不同的分支,其功能类似 if else if … else。

switch基本语法
switch [表达式] {
  case 表达式1:
  	语句块
  case 表达式2:
  	语句块
  case 表达式3:
  	语句块
  ...
  
  default:
  	语句块
}

switch语句的执行流程:先执行表达式,得到值,然后从上到下和case的表达式进行比较,如果相等,就执行对应的case语句块,然后退出switch控制,如果一个都匹配不到,则执行default。
在这里插入图片描述

例子:

package main

import "fmt"

func main() {
    var a = 5
    
    switch (a) {
	case 0:
        fmt.Println("是0")
	case 1:
        fmt.Println("是1")
	case 2:
        fmt.Println("是2")
	case 3:
        fmt.Println("是3")
	case 4:
        fmt.Println("是4")
    case 5:
        fmt.Println("是5")
    case 6:
        fmt.Println("是6")
	default:
        fmt.Println("是其他值")
	}
}

switch语句特性

case后面各个表达式可以是常量、变量表达式,甚至是一个有返回值的函数调用:

package main

import "fmt"

func main() {
    var a = 5
    var b = 4
    
    switch (a) {
	case 0:
        fmt.Println("是0")
	case 1:
        fmt.Println("是1")
	case 2:
        fmt.Println("是2")
	case 3:
        fmt.Println("是3")
	case 4:
        fmt.Println("是4")
    case b+1:
        fmt.Println("是b+1")
    case 5:
        fmt.Println("是5")
    case 6:
        fmt.Println("是6")
	default:
        fmt.Println("是其他值")
	}
}

case后面的各个表达式的值的数据类型,必须和switch的表达式数据类型一致:

package main

import "fmt"

func main() {
    var a = 5
    
    switch (a) {
    case "hello":
        fmt.Println("是hello")	// 编译报错:类型不一致
	case 0:
        fmt.Println("是0")
	case 1:
        fmt.Println("是1")
	case 2:
        fmt.Println("是2")
	case 3:
        fmt.Println("是3")
	case 4:
        fmt.Println("是4")
    case 5:
        fmt.Println("是5")
    case 6:
        fmt.Println("是6")
	default:
        fmt.Println("是其他值")
	}
}

case后面的表达式可以有多个:

package main

import "fmt"

func main() {
    var a = 5
    
    switch (a) {
	case 0, 1:
        fmt.Println("是0或1")
	case 2, 3:
        fmt.Println("是2或3")
	case 4, 5:
        fmt.Println("是4或5")
    case 6:
        fmt.Println("是6")
	default:
        fmt.Println("是其他值")
	}
}

case语句中不需要再写break,因为默认会有。默认情况下,case语句执行完后就退出switch,这点和其他语言(比如C语言)不同:

package main

import "fmt"

func main() {
    var a = 5
    
    switch (a) {
	case 0, 1:
        fmt.Println("是0或1")
        break		// 写不写break都一样
	case 2, 3:
        fmt.Println("是2或3")
        break
	case 4, 5:
        fmt.Println("是4或5")
        break
    case 6:
        fmt.Println("是6")
	default:
        fmt.Println("是其他值")
	}
}

default语句不是必须的:

package main

import "fmt"

func main() {
    var a = 5
    
    switch (a) {
	case 0, 1:
        fmt.Println("是0或1")
	case 2, 3:
        fmt.Println("是2或3")
	case 4, 5:
        fmt.Println("是4或5")
    case 6:
        fmt.Println("是6")
	}
}

default语句可以不放置在最后,无论default语句放置在什么位置,都是最后被检测:

package main

import "fmt"

func main() {
    var a = 100
    
    switch (a) {
    default:
        fmt.Println("是其他值")
	case 0, 1:
        fmt.Println("是0或1")
	case 2, 3:
        fmt.Println("是2或3")
	case 4, 5:
        fmt.Println("是4或5")
    case 6:
        fmt.Println("是6")
	}
}

switch后的表达式可以缺省,此时表示 swtich true:

package main

import "fmt"

func main() {
   var grade string = "B"
   switch { // switch 后的表达式可以缺省,此时表示 switch 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" );
   }   
}

swtich语句的初始化

switch后面可以跟一个初始化式,例如:

switch grade := 90; { // 等价于 switch grade := 90; true
    case grade > 90:
    fmt.Println("成绩优秀...")
    case grade >= 60 && grade <= 90:
    fmt.Println("成就优良")
    default:
    fmt.Println("不及格")
}

type switch

switch语句还可以用于判断某个interface变量中实际存储的变量类型。

语法:

switch x.(type) {
	case type1:
  		语句块
	case type2: 
		语句块
  	default: /*可选*/
    	语句块
}

实例:

package main

import "fmt"

func main() {

    var x interface{}
  
    // 分别给x复制以下不同类型的值,switch语句将会进入不同的分支
    // x = 5
    // x = float64(5.6)
    // x = false
    // x = "hello"

    switch i := x.(type) { //x.()格式是类型断言
    case nil:
        fmt.Printf("x 的类型是: %T", i)
    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("其他类型")
    }
}

5.3 select 语句

在介绍通道的时候再讲解


Copyright@2022 , 359152155@qq.com

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

时空旅客er

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值