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 !



目录
相关文章
|
4天前
|
Go
Go 语言循环语句
在不少实际问题中有许多具有规律性的重复操作,因此在程序中就需要重复执行某些语句。
12 1
|
3天前
|
Go 开发者
探索Go语言的并发之美
在Go语言的世界里,"并发"不仅仅是一个特性,它是一种哲学。本文将带你领略Go语言中goroutine和channel的魔力,揭示如何通过Go的并发机制来构建高效、可靠的系统。我们将通过一个简单的示例,展示如何利用Go的并发特性来解决实际问题,让你的程序像Go一样,轻盈而强大。
|
4天前
|
JSON Go API
使用Go语言和Gin框架构建RESTful API:GET与POST请求示例
使用Go语言和Gin框架构建RESTful API:GET与POST请求示例
|
4天前
|
Go
go语言创建字典
go语言创建字典
|
5天前
|
安全 Go 数据处理
探索Go语言的并发之美:Goroutines与Channels
在Go语言的世界里,"并发"不仅仅是一个概念,它是一种生活的方式。本文将带你领略Go语言中Goroutines和Channels的魔力,它们是如何让并发编程变得既简单又高效。我们将通过一个简单的示例,展示如何使用这些工具来构建一个高性能的网络服务。
|
5天前
|
关系型数据库 Go 数据处理
高效数据迁移:使用Go语言优化ETL流程
在本文中,我们将探索Go语言在处理大规模数据迁移任务中的独特优势,以及如何通过Go语言的并发特性来优化数据提取、转换和加载(ETL)流程。不同于其他摘要,本文不仅展示了Go语言在ETL过程中的应用,还提供了实用的代码示例和性能对比分析。
|
5天前
|
Go 定位技术 索引
Go 语言Map(集合) | 19
Go 语言Map(集合) | 19
|
6天前
|
Go
go语言注释,标识符 | 17
go语言注释,标识符 | 17
|
4天前
|
NoSQL Go API
go语言操作Redis
go语言操作Redis
|
4天前
|
Unix Go
go语言获取当前时间戳
go语言获取当前时间戳