深入剖析Go语言中的Select语句

 更新时间:2023年12月11日 11:03:41   作者:奔跑的蜗牛.  
select是Go中的一个控制结构,类似于switch语句,本文主要介绍了深入剖析Go语言中的Select语句,具有一定的参考价值,感兴趣的可以了解一下

一、select多路复用

1、select说明

  • 传统的方法在遍历管道时,如果不关闭会阻塞而导致deadlock,在实际开发中,可能我们不好确定什么关闭该管道
  • 这种方式虽然可以实现从多个管道接收值的需求,但是运行性能会差很多
  • 为了应对这种场景,Go内置了select关键字,可以同时响应多个管道的操作
  • select的使用类似于switch语句,它有一系列case分支和一个默认的分支
  • 每个case会对应一个管道的通信(接收或发送)过程
  • select会一直等待,直到某个case的通信操作完成时,就会执行case分支对应的语句

具体格式如下:

select {
    case <- chan1:
    //如果chan1成功读到数据,则进行该case处理语句
    case chan2 <- 1 :
       //如果成功向chan2写入数据,则进行该case处理语句
    default :
    //如果上面都没有成功,则进入default处理流程
    
}

2、select的使用 

  • 使用select语句能提高代码的可读性
  • 可处理一个或多个channel的发送/接收操作
  • 如果多个caes同时满足,select会随机选择一个
  • 对于没有case的select{}会一直等待,可用于阻塞main函数
package main

import (
    "fmt"
    "time"
)

func main() {
    //在某些场景下我们需要同时从多个通道接收数据,这个时候就可以用到golang中给我们提供的select多路复用

    //定义一个管道10个数据int
    intChan := make(chan int,10)
    for i :=0;i<10;i++ {
        intChan <- i
    }

   //2.定义一个管道 5个数据string
	stringChan := make(chan string, 5)
	for i := 0; i < 5; i++ {
		stringChan <- "hello" + fmt.Sprintf("%d", i)
	}
	//使用select来获取channel里面的数据的时候不需要关闭channel
	for {
		select {
		case v := <-intChan:
			fmt.Printf("从 intChan 读取的数据%d\n", v)
			time.Sleep(time.Millisecond * 50)
		case v := <-stringChan:
			fmt.Printf("从 stringChan 读取的数据%v\n", v)
			time.Sleep(time.Millisecond * 50)
		default:
			fmt.Printf("数据获取完毕")
			return //注意退出...
		}
	}
}

 到此这篇关于深入剖析Go语言中的Select语句的文章就介绍到这了,更多相关Go语言Select语句内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • GO语言中通道和sync包的使用教程分享

    GO语言中通道和sync包的使用教程分享

    这篇文章主要为大家详细介绍了Go语言中通道和sync包的相关资料,文中的示例代码讲解详细,对我们学习Go语言有一定的帮助,需要的可以参考一下
    2023-02-02
  • Go语言使用Etcd实现分布式锁

    Go语言使用Etcd实现分布式锁

    etcd是近几年比较火热的一个开源的、分布式的键值对数据存储系统,本文将介绍如何利用Etcd实现分布式锁,感兴趣的小伙伴可以跟随小编一起了解一下
    2023-05-05
  • golang 实现tcp server端和client端,并计算RTT时间操作

    golang 实现tcp server端和client端,并计算RTT时间操作

    这篇文章主要介绍了golang 实现tcp server端和client端,并计算RTT时间操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Golang Gin框架获取请求参数的几种常见方式

    Golang Gin框架获取请求参数的几种常见方式

    在我们平常添加路由处理函数之后,就可以在路由处理函数中编写业务处理代码了,但在此之前我们往往需要获取请求参数,本文就详细的讲解下gin获取请求参数常见的几种方式,需要的朋友可以参考下
    2024-02-02
  • 执行go vendor第三方包版本冲突问题解决

    执行go vendor第三方包版本冲突问题解决

    这篇文章主要为大家介绍了执行go vendor时,第三方包go版本冲突问题的解决方法,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • Go语言中Struct与继承与匿名字段和内嵌结构体全面详解

    Go语言中Struct与继承与匿名字段和内嵌结构体全面详解

    这篇文章主要介绍了Go语言中Struct与继承与匿名字段和内嵌结构体,Go语言中通过结构体的内嵌再配合接口比面向对象具有更高的扩展性和灵活性,感兴趣的可以了解一下
    2023-04-04
  • 详解Go语言如何进行Http调用

    详解Go语言如何进行Http调用

    无论是微服务还是单体架构等,服务间都有相互通信的时候,而最直接的通信方法就是 HTTP 调用,本文将会介绍在 Go 语言里,如何进行 HTTP 调用,需要的可以参考一下
    2022-12-12
  • Golang高效实现内网文件传输的实战指南(含完整源码)

    Golang高效实现内网文件传输的实战指南(含完整源码)

    这篇文章主要为大家详细介绍了如何使用Golang实现一个高效的内网文件传输系统,从零构建协议实现断点续传与零拷贝,希望可以让大家在实践中真正理解底层技术的奥秘
    2025-12-12
  • Go语言结合GORM实现数据库事务处理的示例代码

    Go语言结合GORM实现数据库事务处理的示例代码

    这篇文章主要为大家详细介绍了Go语言结合GORM实现数据库事务处理的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-08-08
  • Go语言reflect.TypeOf()和reflect.Type通过反射获取类型信息

    Go语言reflect.TypeOf()和reflect.Type通过反射获取类型信息

    这篇文章主要介绍了Go语言reflect.TypeOf()和reflect.Type通过反射获取类型信息,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04

最新评论