iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > GO >go语言中如何使用select的实现示例
  • 146
分享到

go语言中如何使用select的实现示例

2024-04-02 19:04:59 146人浏览 安东尼
摘要

目录1.基本语法2.select语句的实际应用在golang语言中,select语句 就是用来监听和channel有关的io操作,当IO操作发生时,触发相应的case动作。

golang语言中,select语句 就是用来监听和channel有关的io操作,当IO操作发生时,触发相应的case动作。

有了 select语句,可以实现 main主线程Goroutine线程 之间的互动。

1.基本语法

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

注意事项

  • select语句 只能用于channel信道的IO操作,每个case都必须是一个信道。
  • 如果不设置 default条件,当没有IO操作发生时,select语句就会一直阻塞;
  • 如果有一个或多个IO操作发生时,Go运行时会随机选择一个case执行,但此时将无法保证执行顺序;
  • 对于case语句,如果存在信道值为nil的读写操作,则该分支将被忽略,可以理解为相当于从select语句中删除了这个case;
  • 对于空的 select语句,会引起死
  • 对于在 for中的select语句,不能添加 default,否则会引起cpu占用过高的问题;

(1)多个IO操作发生时,case语句是随机执行的

func main()  {
    ch1 := make(chan int, 1)   // 创建 一个长度带缓冲的整型通道
    ch1 <- 1                   // 向通道中写入数据

    ch2 := make(chan int, 1)
    ch2 <- 2

    select {
        case <- ch1:
            fmt.Println("ch1 read")
        case <- ch2:
            fmt.Println("ch2 read")
    }
}

多次执行后,会随机打印 “ch1 read” 或 “ch2 read”

(2)空select语句

func main()  {
    select {
    
    }
}

执行后,引发死锁,打印如下:

fatal error: all goroutines are asleep - deadlock!

goroutine 1 [select (no cases)]:
main.main()
        xxx/test.go:4 +0x27
exit status 2

(3)for中的select 引起CPU资源消耗过高

func main()  {
    quit := make(chan bool)
    go func() {
        for {
            select {
            case <-quit:
                fmt.Println("quit")
                // 使用 return 就会退出整个goroutine线程;如果使用 break,程序仍然在for循环中执行
                return
            default:
                fmt.Println("default")
            }
        }
    }()

    time.Sleep(3 * time.Second)
    quit <- true          // 主线程在3秒后,向quit信道写入数据
    
    time.Sleep(2 * time.Second)
    fmt.Println("main")
}

在for{}的select语句中使用了 default后,线程就会无限执行default条件,直到quit信道中读到数据,否则会一直在一个死循环中运行,从而导致占满整个CPU资源。

在 for{}的select语句中,不建议使用 default条件。

2.select语句的实际应用

(1)实现 main主线程与 goroutine线程 之间的交互、通信

// 通过控制台输入 "bye", 来控制main函数结束运行
func main()  {
    quit := make(chan bool)
    ch := make(chan string)

    go func() {
        for {
            select {
            case name := <-ch:
                fmt.Printf("from main msg: [%v]\n", name)
                if name == "bye" {
                    quit <- true
                } else {
                    quit <- false
                }
            }
        }
    }()

    for {
        // 控制台输入
        fmt.Print("please input string: ")
        scanner := bufio.NewScanner(os.Stdin)
        scanner.Scan()
        ch <- scanner.Text()

        isOver := <- quit
        if isOver {
            break
        }
    }
    fmt.Println("main over")
}

运行:

from main msg: [aaa]
please input string: bbb
from main msg: [bbb]
please input string: bye
from main msg: [bye]
main over

(2)超时实现

func main()  {
    quit := make(chan bool)
    ch := make(chan int)

    go func() {
        for {
            select {
            case num := <- ch:
                fmt.Println("num = ", num)
            case <- time.After(5 * time.Second):
                fmt.Println("超时")
                quit <- true
            }
        }
    }()

    for i := 0; i < 2; i++ {
        ch <- i
        time.Sleep(time.Second)
    }
    <- quit                   // 等待超时后, 结束 main主线程
    fmt.Println("程序结束")
}

到此这篇关于go语言中如何使用select的实现示例的文章就介绍到这了,更多相关go语言使用select内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

您可能感兴趣的文档:

--结束END--

本文标题: go语言中如何使用select的实现示例

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

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

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

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

下载Word文档
猜你喜欢
  • go语言中如何使用select的实现示例
    目录1.基本语法2.select语句的实际应用在golang语言中,select语句 就是用来监听和channel有关的IO操作,当IO操作发生时,触发相应的case动作。...
    99+
    2024-04-02
  • Go语言select语句用法示例
    目录用法使用场景实现收发功能注意事项用法 多个通道 Channel 中信息的发送和接受处理的专用的语句—select 语句。select 语句会阻塞,直到其中的一个发送/...
    99+
    2024-04-02
  • 实例演示:如何在Go语言中使用元组
    在Go语言中,虽然并没有内置的元组类型,但是我们可以使用结构体或者切片来实现类似元组的功能。下面将通过具体的代码示例来演示如何在Go语言中使用元组。 首先,我们可以定义一个结构体来代替...
    99+
    2024-04-02
  • go语言中怎么使用select
    这篇文章主要介绍“go语言中怎么使用select”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“go语言中怎么使用select”文章能帮助大家解决问题。在golang语言中,select语句...
    99+
    2023-06-30
  • sql中select语句的使用示例
    这篇文章主要介绍了sql中select语句的使用示例,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。SQL SELECT 语句SEL...
    99+
    2024-04-02
  • Go语言使用buffer读取文件的实现示例
    目录使用 bufio 包写入文件使用 bufio 包读取文件buffer 是缓冲器的意思,Go语言要实现缓冲读取需要使用到 bufio 包。bufio 包本身包装了 io.Reade...
    99+
    2023-05-14
    Go buffer读取文件 Go buffer读取
  • go语言操作es的实现示例
    目录Elasticsearch介绍Elasticsearch能做什么go语言操作es解决golang使用elastic连接elasticsearch时自动转换连接地址初始化数据创建查...
    99+
    2024-04-02
  • go语言csrf库使用实现原理示例解析
    目录引言csrf小档案一、CSRF及其实现原理CSRF攻击示例二、如何预防三、CSRF包的使用及实现原理csrf包的安装基本使用使用net/http包启动的服务echo框架下使用cs...
    99+
    2024-04-02
  • GO语言中defer实现原理的示例详解
    目录GO 中 defer的实现原理defer 是什么defer 实现原理GO 中 defer 的规则第一点咱们来写个小DEMO第三点也来一个DEMO总结GO 中 defer的实现原理...
    99+
    2023-02-24
    GO语言defer实现原理 GO语言defer原理 GO defer
  • go中如何使用select
    这篇文章主要为大家展示了“go中如何使用select”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“go中如何使用select”这篇文章吧。golang中的select语句格式如下select&n...
    99+
    2023-06-26
  • 在 Go 语言中如何使用/实现切面?
    小伙伴们有没有觉得学习Golang很有意思?有意思就对了!今天就给大家带来《在 Go 语言中如何使用/实现切面?》,以下内容将会涉及到,若是在学习中对其中部分知识点有疑问,或许看了本文就能帮到你!问...
    99+
    2024-04-04
  • GO语言中Chan实现原理的示例详解
    目录GO 中 Chan 实现原理分享chan 是什么GO 中 Chan 的底层数据结构咱们来画个图看看dataqsiz 对应的环形队列是啥样的写 sendq和 读 recvq 等待队...
    99+
    2023-02-24
    GO语言Chan实现原理 GO语言Chan原理 GO语言Chan
  • go语言心跳超时的实现示例
    目录一、背景二、心跳超时的实现2.1 通过select case (设计概念比较多)2.2 通过time.sleep(简单有效)三、个人的实现观感一、背景 本文描述的是客户端接收心跳...
    99+
    2024-04-02
  • Go语言中循环语句使用的示例详解
    目录一、概述1. 循环控制语句2. 无限循环二、Go 语言 for 循环1. 语法2. for语句执行过程3. 示例4. For-each range 循环三、循环嵌套1. 语法2....
    99+
    2024-04-02
  • 使用GO语言实现Mysql数据库CURD的简单示例
    目录〇、介绍驱动包和增强版Mysql操作库Sqlx一、先导入驱动包和增强版Mysql操作库Sqlx 二、insert操作 三、delete操作 四、update操作 五、s...
    99+
    2024-04-02
  • Go语言实现枚举的示例代码
    在编程领域里,枚举用来表示只包含有限数量的固定值的类型,在开发中一般用于标识错误码或者状态机。拿一个实体对象的状态机来说,它通常与这个对象在数据库里对应记录的标识状态的字段值相对应。...
    99+
    2024-04-02
  • 实用的Go语言开发工具及使用示例
    目录前言json-to-goyaml-to-gotable-to-go命令行调用Go 代码调用前言 孙悟空在花果山称王的时候,特意去了一趟东海,在那里淘到了如意金箍棒。因为身为一个山...
    99+
    2024-04-02
  • 如何使用Go语言实现的api网关
    小编给大家分享一下如何使用Go语言实现的api网关,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!浏览器的请求去请求目标地址,然后获得结果它再发送给浏览器。对于Go语言来说,实现转发只需要简单的一行代码即可实现,如下所示:h...
    99+
    2023-06-21
  • Go语言中goroutine和WaitGroup的使用示例详解
    目录Go语言中goroutine和WaitGroup的使用介绍例子扩展:Go的goroutine与sync.WaitGroup的初步使用Go语言中goroutine和WaitGrou...
    99+
    2023-03-03
    go goroutine和WaitGroup使用 go goroutine和WaitGroup
  • Go语言中锁如何实现
    今天小编给大家分享一下Go语言中锁如何实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。Lock// Lock&n...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作