iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > GO >golang中select语句怎么使用
  • 782
分享到

golang中select语句怎么使用

2023-07-02 14:07:39 782人浏览 独家记忆
摘要

这篇文章主要介绍“golang中select语句怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Golang中select语句怎么使用”文章能帮助大家解决问题。前言在golang语言中,sel

这篇文章主要介绍“golang中select语句怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Golang中select语句怎么使用”文章能帮助大家解决问题。

前言

在golang语言中,select语句 就是用来监听和channel有关的io操作,当IO操作发生时,触发相应的case动作。有了 select语句,可以实现 main主线程 与 goroutine线程 之间的互动。

select {    case <-ch2 :     // 检测有没有数据可读        // 一旦成功读取到数据,则进行该case处理语句    case ch3 <- 1 :  // 检测有没有数据可写        // 一旦成功向ch3写入数据,则进行该case处理语句    default:        // 如果以上都没有符合条件,那么进入default处理流程}

注意事项:

  • select语句 只能用于channel信道的IO操作,每个case都必须是一个信道。

  • 如果不设置 default条件,当没有IO操作发生时,select语句就会一直阻塞;

  • 如果有一个或多个IO操作发生时,Go运行时会随机选择一个case执行,但此时将无法保证执行顺序;

  • 对于case语句,如果存在信道值为nil的读写操作,则该分支将被忽略,可以理解为相当于从select语句中删除了这个case;

  • 对于空的 select语句,会引起死锁;

  • 对于在 for中的select语句,不能添加 default,否则会引起cpu占用过高的问题;

1.先举个简单例子

先创建两个信道,并在 select 前往 c2 发送数据

package main import ("fmt") //go的通道选择器 让你可以同时等待多个通道操作。go协程和通道以及选择器的结合是go的一个强大特性。 func main() {// 在我们的例子中,我们将从两个通道中选择。c1 := make(chan string, 1)c2 := make(chan string, 1) c2 <- "nihao" //go func() {//time.Sleep(time.Second * 1)//c1 <- "one"//}()////go func() {//time.Sleep(time.Second * 2)//c2 <- "two"//}() //我们使用 `select` 关键字来同时等待这两个值,并打印各自接收到的值。//for i := 0; i < 2; i++ {select {case msg1 := <-c1:fmt.Println("received", msg1)case msg2 := <-c2:fmt.Println("received", msg2)default:fmt.Println("No data received")}//} }

在运行 select 时,会遍历所有(如果有机会的话)的 case 表达式,只要有一个信道有接收到数据,那么 select 就结束,所以输出如下

golang中select语句怎么使用

2. 避免造成死

select 在执行过程中,必须命中其中的某一分支。

如果在遍历完所有的 case 后,若没有命中(命中:也许这样描述不太准确,我本意是想说可以执行信道的操作语句)任何一个 case 表达式,就会进入 default 里的代码分支。

package main import ("fmt") //go的通道选择器 让你可以同时等待多个通道操作。go协程和通道以及选择器的结合是go的一个强大特性。 func main() {// 在我们的例子中,我们将从两个通道中选择。c1 := make(chan string, 1)c2 := make(chan string, 1) //c2 <- "nihao" //go func() {//time.Sleep(time.Second * 1)//c1 <- "one"//}()////go func() {//time.Sleep(time.Second * 2)//c2 <- "two"//}() //我们使用 `select` 关键字来同时等待这两个值,并打印各自接收到的值。//for i := 0; i < 2; i++ {select {case msg1 := <-c1:fmt.Println("received", msg1)case msg2 := <-c2:fmt.Println("received", msg2)//default://fmt.Println("No data received")//}}}

 但如果你没有写 default 分支,select 就会阻塞,直到有某个 case 可以命中,而如果一直没有命中,select 就会抛出 deadlock 的错误,就像下面这样子。

golang中select语句怎么使用

1.解决这个问题的方法有两种

一个是,养成好习惯,在 select 的时候,也写好 default 分支代码,尽管你 default 下没有写任何代码。

golang中select语句怎么使用

 另一个是,让其中某一个信道可以接收到数据

golang中select语句怎么使用

3. select 随机性

之前学过 switch 的时候,知道了 switch 里的 case 是顺序执行的,但在 select 里却不是。

通过下面这个例子的执行结果就可以看出

golang中select语句怎么使用

4. select 的超时

当 case 里的信道始终没有接收到数据时,而且也没有 default 语句时,select 整体就会阻塞,但是有时我们并不希望 select 一直阻塞下去,这时候就可以手动设置一个超时时间。

golang中select语句怎么使用

5. 读取/写入都可以

上面例子里的 case,好像都只从信道中读取数据,但实际上,select 里的 case 表达式只要求你是对信道的操作即可,不管你是往信道写入数据,还是从信道读出数据。

golang中select语句怎么使用

golang中select语句怎么使用

关于“golang中select语句怎么使用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网GO频道,小编每天都会为大家更新不同的知识点。

您可能感兴趣的文档:

--结束END--

本文标题: golang中select语句怎么使用

本文链接: https://www.lsjlt.com/news/342276.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • golang中select语句怎么使用
    这篇文章主要介绍“golang中select语句怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“golang中select语句怎么使用”文章能帮助大家解决问题。前言在golang语言中,sel...
    99+
    2023-07-02
  • golang select语句怎么使用
    在Go语言中,select语句用于在多个通信操作中选择一个进行执行。select语句的基本语法如下:goselect {case &...
    99+
    2023-10-21
    golang
  • asp中select语句怎么使用
    在ASP中使用SELECT语句查询数据库可以通过以下步骤来实现:1. 创建数据库连接对象:```Set conn = Ser...
    99+
    2023-09-25
    asp
  • oracle中insert select语句怎么使用
    在Oracle中,可以使用INSERT INTO SELECT语句来将查询结果插入到另一个表中。语法如下: INSERT I...
    99+
    2024-04-19
    oracle
  • vb中select case语句怎么使用
    在VB中,Select Case语句用于根据表达式的值来执行不同的代码块。 语法: Select Case expression ...
    99+
    2024-02-29
    vb
  • mysql中select if语句怎么使用
    在MySQL中,可以使用SELECT IF语句进行条件判断和选择。SELECT IF语句的语法如下: SELECT IF(c...
    99+
    2024-04-09
    mysql
  • MySQL中select insert语句怎么使用
    在MySQL中,SELECT INSERT语句用于将SELECT查询的结果插入到另一个表中。其语法如下: INSERT IN...
    99+
    2024-04-09
    MySQL
  • access select语句怎么使用
    SELECT语句用于从数据库中选择数据。它的基本语法如下:```sqlSELECT 列名1, 列名2, ... FROM 表...
    99+
    2023-09-22
    access
  • MySQL的select语句怎么使用
    这篇“MySQL的select语句怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“MySQL的select语...
    99+
    2023-06-27
  • java的select语句怎么使用
    在Java中,可以使用JDBC(Java Database Connectivity)来执行SQL查询语句。以下是一个使用JDBC执...
    99+
    2023-09-20
    java
  • vb select case语句怎么使用
    在VB中,Select Case语句用于根据不同的条件执行不同的代码块。下面是Select Case语句的基本语法: Select ...
    99+
    2024-02-29
    vb
  • VBS中Select Case语句的使用
    本篇内容介绍了“VBS中Select Case语句的使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Select Case 语句根据表达式...
    99+
    2023-06-08
  • SQL中SELECT语句如何使用
    SQL中SELECT语句如何使用,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。  SQL嵌套SELECT语句的用法有哪些  1、单行子...
    99+
    2024-04-02
  • mysql的select语句中in怎么用
    本篇内容介绍了“mysql的select语句中in怎么用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有...
    99+
    2024-04-02
  • golang中select语句的简单实例
    目录前言1.先举个简单例子2. 避免造成死锁3. select 随机性4. select 的超时5. 读取/写入都可以6. 总结一下前言 在golang语言中,select语句 就是...
    99+
    2024-04-02
  • MySQL中select into outfile语句怎么用
    在MySQL中,SELECT INTO OUTFILE语句用于将查询结果导出到一个文件中。使用该语句的基本语法如下:...
    99+
    2024-03-01
    MySQL
  • sql中select语句的使用示例
    这篇文章主要介绍了sql中select语句的使用示例,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。SQL SELECT 语句SEL...
    99+
    2024-04-02
  • Golang函数的select语句应用方法
    Golang作为一种高效、灵活的编程语言,吸引了越来越多的开发者的关注。而其中一个重要的特性——select语句,更是赢得了众多开发者的青睐。这篇文章将介绍Golang函数中select语句的应用方法,帮助读者深入了解该语句的使用...
    99+
    2023-05-16
    Golang 函数 select语句
  • mysql查询语句select命令怎么使用
    在MySQL中,使用SELECT命令可以从数据库中检索数据。其基本语法如下: SELECT column1, column2...
    99+
    2024-04-09
    mysql
  • SQLite的SELECT语句如何使用
    这篇文章主要讲解了“SQLite的SELECT语句如何使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SQLite的SELECT语句如何使用”吧!语法SQLite 的 SELECT...
    99+
    2023-06-27
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作