go语言分支语句、条件语句

简介: go语言分支语句、条件语句

介绍go语言的分支语句有几种,以及如何使用



(一)分支语句概述


  总的来说有三类:
    if...elseif...else...
    switch...case...default...
    select....
  注意点:
    不支持三目运算符
    在使用&&,||时支持阻断机制(也就是说前面的语句可以满足整个条件时后面条件不再判断)


(二)细说分支语句


①if…elseif…else…


    值得注意的是:
      (1)go语言if分支判断条件可以不加括号
      (2)else或else if书写的时候不可以换行(五颗星)
    (3)每一个分支语句块都必须加{}加以限定,否则会编译出错
    (4)遇到匹配的条件进入执行,其余符合的条件将被阻断


  例如:
  a := 11
  // if else if else语句
  if a > 10 {
    fmt.Println("a大于10")
  } else if a < 10 {
    fmt.Println("a小于10")
  } else {
    fmt.Println("a等于10")
  }


②switch…case…default…


  值得注意的是:
    (1)switch语句与其他语言的区别是go语言的case语句不用加break语句
    找到匹配的项直接进行case然后执行完退出
    (2)并且go语言中case语句可以在一个case语句中可以捕获多个可满足的条件
    (3)case语句中可以使用fallthrough强制执行case后面的语句,无论是否满足条件
    执行的时候会从第一个满足条件的case语句向下执行,执行到没有fallthrough代码块后
    无论后面case是否满足条件都将跳出
    (4)switch语句中每一个case捕获到的类型要保持一致
    (5)不可以两个case捕获的条件相同
    (6)switch语句中不像if分支语句那样严格要求{}


正常的switch语句
  //switch判断一个变量的类型
  switch mytype := x.(type) {//后面学反射的时候会学这个b.(type)
  case nil:
    fmt.Printf(" x 的类型 :%T", i)//%T代表打印变量的类型
  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的switch语句
这里会一直执行打印到4、case 条件语句为 true这一行
  switch {
  case true:
    fmt.Println("1、case 条件语句为 false")
    fallthrough
  case true:
    fmt.Println("2、case 条件语句为 true")
    fallthrough
  case false:
    fmt.Println("3、case 条件语句为 false")
    fallthrough
  case false:
    fmt.Println("4、case 条件语句为 true")
  case true:
    {
      fmt.Println("5、case 条件语句为 false")
      fmt.Println("666")
    }
    fmt.Println("666")
    fallthrough
  default:
    {
      fmt.Println("123")
    }
  }


③select…


  select语句概述:
    select语句类似于用于通信的switch语句,每个case必须是一个通信操作,要么发送要么接收
  select运行机制:
    select语句会从通道内进行取值select会先检测那几个case符合筛选条件,如果有的话select就
    会在符合条件的case中选择一个进行执行如果没有一个case符合条件,就会选择default执行,
    如果没有default选项就会进入阻塞状态直至满足case条件,如果select被阻塞,其他线程没有
    被time.Sleep之外的阻塞所阻塞,则不会抛死锁异常如果select被阻塞,其他线程被time.Sleep之
    外的阻塞方式阻塞了,则抛出死锁异常


介绍select代码之前先简要概述一下通道(先声明后初始化,先进先出)
通道的长度决定了通道可以存放多少个数据(后面会详细介绍,这里就是为了理解select语句)
通道声明:
  只有一个位置的int型通道
  var a chan int
  a = make(chan int, 1)
  有101个位置的int型通道
  var b chan int
  b = make(chan int, 101)
通道使用:
  存数据 a<-10(将10存进了通道a内)
  取数据 i:=<-a(将a内的10取出放在变量i内)


1、测试随机性


测试select语句执行case条件的随机性,其中b是一个通道
  for i := 0; i < 10; i++ {
    select {
    case b <- i:
      fmt.Println("1号就绪!")
    case b <- i:
      fmt.Println("2号就绪!")
    case b <- i:
      fmt.Println("3号就绪!")
    case b <- i:
      fmt.Println("4号就绪!")
    case b <- i:
      fmt.Println("5号就绪!")
    case b <- i:
      fmt.Println("6号就绪!")
    case b <- i:
      fmt.Println("7号就绪!")
    case b <- i:
      fmt.Println("8号就绪!")
    case b <- i:
      fmt.Println("9号就绪!")
    }
  }
结果(随机打印):
    6号就绪!
    8号就绪!
    7号就绪!
    2号就绪!
    9号就绪!
    8号就绪!
    9号就绪!
    1号就绪!
    6号就绪!
    5号就绪!


2、测试可满足条件


开始通道a内没有数据,取数据时阻塞所以第一个条件不满足
必须先向a输入数据i才可以对a进行取值,所以先打印 投递成功!
又因为a是只能存放一个数据的通道,所以当a内有数据时打印i的值。
  for i := 0; i < 10; i++ {
    select {
    case x := <-a:
      fmt.Println(x)
    case a <- i:
      fmt.Println("投递成功!")
    }
  }
结果:
    投递成功!
    0        
    投递成功!
    2        
    投递成功!
    4        
    投递成功!
    6        
    投递成功!
    8  


④Go语言中没有三目运算符

99491ed48f46420aad81cb28cdd1481c.png


GO GO GO !



目录
相关文章
|
5天前
|
安全 网络协议 Go
Go语言网络编程
【10月更文挑战第28天】Go语言网络编程
93 65
|
5天前
|
网络协议 安全 Go
Go语言进行网络编程可以通过**使用TCP/IP协议栈、并发模型、HTTP协议等**方式
【10月更文挑战第28天】Go语言进行网络编程可以通过**使用TCP/IP协议栈、并发模型、HTTP协议等**方式
27 13
|
1天前
|
测试技术 Go
go语言中测试工具
【10月更文挑战第22天】
8 4
|
1天前
|
SQL 关系型数据库 MySQL
go语言中数据库操作
【10月更文挑战第22天】
10 4
|
1天前
|
缓存 前端开发 中间件
go语言中Web框架
【10月更文挑战第22天】
11 4
|
5天前
|
网络协议 安全 Go
Go语言的网络编程基础
【10月更文挑战第28天】Go语言的网络编程基础
22 8
|
4天前
|
Go
go语言的复数常量
【10月更文挑战第21天】
17 6
|
4天前
|
Go
go语言的浮点型常量
【10月更文挑战第21天】
13 4
|
4天前
|
编译器 Go
go语言的整型常量
【10月更文挑战第21天】
15 3
|
5天前
|
Go
go语言编译时常量表达式
【10月更文挑战第20天】
16 3

相关实验场景

更多