golang select介绍和使用,select中的case只会执行一个吗?

在 Go 语言中,select 语句用于处理多个通道(channel)操作。它的行为和 switch 语句有些相似,但专门用于通道通信。select 语句可以让一个 Goroutine 同时等待多个通道操作,并在其中一个通道准备好时进行处理。

select 的基本用法

一个 select 语句的结构如下:

select {
case <-ch1:
    // 当 ch1 有数据可读时执行
case ch2 <- x:
    // 当 ch2 可以写入数据时执行
default:
    // 如果没有任何一个 case 可以执行,执行 default
}

工作原理

  1. 等待多个通道操作select 会阻塞,直到其中一个 case 的通道操作可以进行。
  2. 选择执行一个 case:当有多个 case 可以执行时,select 会随机选择一个执行。
  3. 执行 default:如果存在 default 子句,并且没有其他 case 可以执行,default 会立即执行。

只有一个 case 会被执行吗?

是的,在一次 select 操作中,只有一个 case 会被执行。即使有多个 case 可以同时执行,select 也只会随机选择其中一个进行处理。

示例

以下是一个简单的 select 使用示例:

package main

import (
    "fmt"
    "time"
)

func main() {
    ch1 := make(chan string)
    ch2 := make(chan string)

    go func() {
        time.Sleep(1 * time.Second)
        ch1 <- "message from ch1"
    }()

    go func() {
        time.Sleep(2 * time.Second)
        ch2 <- "message from ch2"
    }()

    for i := 0; i < 2; i++ {
        select {
        case msg1 := <-ch1:
            fmt.Println(msg1)
        case msg2 := <-ch2:
            fmt.Println(msg2)
        }
    }
}

在这个示例中,两个 Goroutine 分别在不同的时间向 ch1ch2 写入消息。select 语句会等待这两个通道的消息并打印出来。由于 ch1 在 1 秒后写入,ch2 在 2 秒后写入,select 首先会执行 ch1case,然后是 ch2case

总结

  • select 用于多通道操作的选择。
  • 一次 select 只会执行一个 case
  • 如果有多个 case 可以执行,会随机选择一个。
  • default 子句可以避免 select 阻塞。
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值