Go语言select语句用法示例

目录
  • 用法
  • 使用场景
    • 实现收发功能
  • 注意事项

用法

多个通道 Channel 中信息的发送和接受处理的专用的语句—select 语句。select 语句会阻塞,直到其中的一个发送/接收操作准备好。select 语句和 switch 语句有点相似,但 select 语句在被执行时会选择执行其中的一个分支,且选择分支的方法完全是不相同的。

ch1 = make(chan string)
ch2 = make(chan string)
ch1 <- "server1"
ch2 <- "server1"
select {
    case i := <- ch1:
      fmt.Printf("从ch1读取了数据%d", i)
    case j := <- ch2:
      fmt.Printf("从ch2读取了数据%d", i)
    default:
      fmt.Printf("no action...", i)
}

以上代码中,每个 case 后都只针对某个通道的接收语句,这个和 switch 不同,也没有 break。switch 语句右边是一个switch 表达式,但 select 右边是接大括号。

开始执行 select 语句时,所有跟在 case 关键字右边的表达式都会被求值,求值的顺序是自上而下,从左到右的。

使用场景

实现收发功能

select 是控制 channel 必不可少的部分,channel 的主要功能就是收发信息,基于此可以设计一个生产者消费者功能。生产者发送消息,消费者接受消息

func main(){
// 生产数据,将数据写入 channel
  n1 := make(chan int)
    go func() {
        i := 0
        for {
            time.Sleep(time.Duration(rand.Intn(1000)) * time.Millisecond)
            n1 <- i
            i++
        }
    }()
    n2 := make(chan int)
    go func() {
        i := 0
        for {
            time.Sleep(time.Duration(rand.Intn(1000)) * time.Millisecond)
            n2 <- i
            i++
        }
    }()
// 从 channel 中读取到数据就输出
    for {
        select {
        case n := <-n1:
            fmt.Printf("从ch1读取了数据%d", n)
        case n := <-n2:
            fmt.Printf("从ch1读取了数据%d", n)
        }
    }
}

注意事项

  • select 只能用于 chan 的 IO 操作
  • select 的 case 都是并行的,case 读取到数据就执行,但是如果没有读取到且未设置 default 将导致阻塞
  • 尽量设置 default 避免没有 IO 操作发生时,select 语句一直阻塞,直到某个 case 分支命中
  • 如果是空的 select 有可能会引起死锁,所以在 select 执行过程中,必须命中某一 case 分支
select {}
  • 防止阻塞还有一个方法:设置超时

以上就是Go语言select语句用法示例的详细内容,更多关于Go select语句的资料请关注我们其它相关文章!

(0)

相关推荐

  • Go语言使用select{}阻塞main函数介绍

    很多时候我们需要让main函数不退出,让它在后台一直执行,例如: func main() { for i := 0; i < 20; i++ { //启动20个协程处理消息队列中的消息 c := consumer.New() go c.Start() } select {} // 阻塞 } 可能大多数人想到阻塞的方法是用channel,当然都是可以的,不过用select{}更加简洁 :) 补充:由浅入深聊聊Golang中select的实现机制 正文 话说今天在玩select的时候发现一个问题,是

  • go select的用法

    目录 1. select语句只能用于信道的读写操作 2. select中的case语句是随机执行的 3. 对于case条件语句中,如果存在通道值为nil的读写操作,则该分支将被忽略 4. 超时用法 5. 空select{} 6. for中的select 引起的CPU过高的问题 补充:7. 使用 select 切换协程 golang中的select语句格式如下 select {     case <-ch1:         // 如果从 ch1 信道成功接收数据,则执行该分支代码     cas

  • golang select 机制和超时问题

    golang 中的协程使用非常方便,但是协程什么时候结束是一个控制问题,可以用 select 配合使用. 首先声明,golang 使用并不熟悉,本文仅仅是记录使用过程中遇到的一些坑. 子协程和父协程的通信通常用 context 或者 chan.我遇到一个通常的使用场景,在子协程中尝试多次处理,父协程等待一段时间超时,我选择用 chan 实现.我以为 select 和 C++ 中 switch 类似,所以最开始代码类似如下: for { select { case <-ctx.Done(): //

  • Golang的select多路复用及channel使用操作

    看到有个例子实现了一个类似于核弹发射装置,在发射之前还是需要随时能输入终止发射. 这里就可以用到cahnnel 配合select 实现多路复用. select的写法用法有点像switch.但是和switch不同的是,select的一个case代表一个通信操作(在某个channel上进行发送或者接收)并且会包含一些语句组成的一个语句块.现在让我们来实现一下这个核弹发射器 package main import ( "fmt" "time" "os"

  • go语言编程之select信道处理示例详解

    目录 select信道处理 fibonacci数列监听 select监听协程 select信道处理 注意:有default就不会阻塞 package main func main() { var chan1 = make(chan int) var chan2 = make(chan int) select { case <-chan1: // 如果chan1成功读到数据,则进行该case处理语句 case chan2: // 如果chan2成功读到数据,则进行该case处理语句 default

  • Go语言select语句用法示例

    目录 用法 使用场景 实现收发功能 注意事项 用法 多个通道 Channel 中信息的发送和接受处理的专用的语句—select 语句.select 语句会阻塞,直到其中的一个发送/接收操作准备好.select 语句和 switch 语句有点相似,但 select 语句在被执行时会选择执行其中的一个分支,且选择分支的方法完全是不相同的. ch1 = make(chan string) ch2 = make(chan string) ch1 <- "server1" ch2 <

  • MySQL中or语句用法示例

    1.mysql中or语法的使用,在mysql语法中or使用注意点. 项目遇到坑,遍历发放奖励数据查询错误!!! $sql = 'SELECT * FROM `vvt_spread_doubleegg_exchange_award` AS p WHERE p.`act_type` = 4 or p.`act_type` = 5 AND p.`user_id` = ' .$user_id ; sql中的or语法一般用于多个条件的查询,上面的语法查询的相当于:两个sql查询出来的数据集合. $sql

  • Go语言中Select语句用法实例

    本文实例讲述了Go语言中Select语句用法.分享给大家供大家参考.具体分析如下: select 语句使得一个 goroutine 在多个通讯操作上等待. select 会阻塞,直到条件分支中的某个可以继续执行,这时就会执行那个条件分支.当多个都准备好的时候,会随机选择一个. 复制代码 代码如下: package main import "fmt" func fibonacci(c, quit chan int) {         x, y := 1, 1         for {

  • mysql学习笔记之完整的select语句用法实例详解

    本文实例讲述了mysql学习笔记之完整的select语句用法.分享给大家供大家参考,具体如下: 本文内容: 完整语法 去重选项 字段别名 数据源 where group by having order by limit 首发日期:2018-04-11 完整语法: 先给一下完整的语法,后面将逐一来讲解. 基础语法:select 字段列表 from 数据源; 完整语法:select 去重选项 字段列表 [as 字段别名] from 数据源 [where子句] [group by 子句] [havin

  • c语言中&的用法示例代码

    1.用于指针赋值 #include<stdio.h> int main() { int a = 2; int*b;//定义一个整形指针 b = &a;//给指针赋值,使指针指向a的地址 printf("%d", b);//输出的是a的地址 printf("\n");//换行符 printf("%d", *b);//*的作用是解引用,取出指针指向地址的内容,达到简 return 0; } 2.用于二目运算中的按位(位运算)与运算

  • thinkPHP模板中for循环与switch语句用法示例

    本文实例讲述了thinkPHP模板中for循环与switch语句用法.分享给大家供大家参考,具体如下: 1.for用法 <for start="开始值" end="结束值" comparison="" step="步进值" name="循环变量名" > </for> 案例 <for start="1" end="100"> {$i}

  • Python基础之循环语句用法示例【for、while循环】

    本文实例讲述了Python基础之循环语句用法.分享给大家供大家参考,具体如下: while 循环 Python中while语句的一般形式: while 判断条件:     statements 同样需要注意冒号和缩进.另外,在Python中没有do..while循环. 以下实例使用了 while 来计算 1 到 100 的总和: #!/usr/bin/env python3 n = 100 sum = 0 counter = 1 while counter <= n: sum = sum + c

  • C语言for语句用法详解

    首先,这里所提到的类C语言指的是如C.C++.C#和Java等语法和C语言一样或类似的程序设计语言.这些语言中,for语句的语法和执行流程都是一样的.本文将就这一语句的用法进行一个较为深入的讨论. for语句: 复制代码 代码如下: for (表达式1;表达式2;表达式3) {   循环语句 } 表达式1 给循环变量赋初值 表达式2 为循环条件 表达式3 用来修改循环变量的值,称为循环步长. for语句的执行流程: 例:编程计算:1+2+3+...+99+100的结果. 这是累加问题,累加问题的

  • C语言基础函数用法示例详细解析

    目录 函数 函数定义 函数一般格式 C语言函数分类 库函数 库函数的分类 库函数的学习 自定义函数 函数的参数 实际参数 形式参数 函数的调用 传值调用 传址调用 无参函数调用 函数的声明和定义 函数的声明 函数的定义 函数声明与定义的区别 exit与return介绍 函数 函数定义 百度百科对函数的定义:子程序 在计算机科学中,子程序是一个大型程序中的某部分代码,有一个或者多个语句块组成,它负责完成某项特定的任务,而且相比于其他的代码,具备相对的独立性. 一般来说会有输入参数和返回值,提供对过

  • python语言基本语句用法总结

    python语句与语法 1.python简单语句的基本介绍 >>> while True: #简单的while循环 ... reply = input('Enter text:') #调用了Input,将输入传参给reply ... if reply == 'stop': break #如果输入的是stop就退出循环 ... print(reply.upper()) #如果输入的不是stop就一直将输入的转换为大写字母 ... Enter text:abc #这是第一个输入abc,看到下

随机推荐