Go语言select语句用法示例

 更新时间:2022年08月03日 14:23:30   作者:六号积极分子  
这篇文章主要为大家介绍了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语句的资料请关注脚本之家其它相关文章!

相关文章

  • Go接口构建可扩展Go应用示例详解

    Go接口构建可扩展Go应用示例详解

    本文深入探讨了Go语言中接口的概念和实际应用场景。从基础知识如接口的定义和实现,到更复杂的实战应用如解耦与抽象、多态、错误处理、插件架构以及资源管理,文章通过丰富的代码示例和详细的解释,展示了Go接口在软件开发中的强大功能和灵活性
    2023-10-10
  • 我放弃Python转Go语言的9大理由(附优秀书籍推荐)

    我放弃Python转Go语言的9大理由(附优秀书籍推荐)

    这篇文章主要给大家介绍了关于我放弃Python转Go语言的9大理由,以及给大家推荐了6本优秀的go语言书籍,对同样想学习golang的朋友们具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-10-10
  • golang时间及时间戳的获取转换

    golang时间及时间戳的获取转换

    本文主要介绍了golang时间及时间戳的获取转换,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • Go Time库中时间和日期相关的操作方法整理

    Go Time库中时间和日期相关的操作方法整理

    这篇文章主要为大家整理了Go语言中的time库,包括时间、日期和时区等相关概念及使用方法,希望通过掌握这些知识,大家可以更好地处理时间、日期和时区相关的问题
    2023-08-08
  • Go 实现热重启的详细介绍

    Go 实现热重启的详细介绍

    这篇文章主要介绍了Go 实现热重启的详细介绍,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • 详解go中的defer链如何被遍历执行

    详解go中的defer链如何被遍历执行

    为了在退出函数前执行一些资源清理的操作,例如关闭文件、释放连接、释放锁资源等,会在函数里写上多个defer语句,多个_defer 结构体形成一个链表,G 结构体中某个字段指向此链表,那么go中的defer链如何被遍历执行,本文将给大家详细的介绍,感兴趣的朋友可以参考下
    2024-01-01
  • Go container包的介绍

    Go container包的介绍

    这篇文章主要介绍了Go container包,go语言container包中有List和Element容器ist和Element都是结构体类型。结构体类型有一个特点,那就是它们的零值都会是拥有其特定结构,但没有任何定制化内容的值,相当于一个空壳,下面一起进文章来了解具体内容吧
    2021-12-12
  • Go语言通道之缓冲通道

    Go语言通道之缓冲通道

    这篇文章介绍了Go语言通道之缓冲通道,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • Golang实现带优先级的select

    Golang实现带优先级的select

    这篇文章主要为大家详细介绍了如何在Golang中实现带优先级的select,文中的示例代码讲解详细,对我们学习Golang有一定的帮助,需要的可以参考一下
    2023-04-04
  • golang 如何替换掉字符串里面的换行符\n

    golang 如何替换掉字符串里面的换行符\n

    这篇文章主要介绍了golang 替换掉字符串里面的换行符\n操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03

最新评论