首页 > 其他分享 >go select 使用总结

go select 使用总结

时间:2023-07-05 23:22:08浏览次数:40  
标签:总结 语句 ch1 case go 操作 select 通道

转载请注明出处:

  在Go语言中,select语句用于处理多个通道的并发操作。它类似于switch语句,但是select语句用于通信操作,而不是条件判断。select语句会同时监听多个通道的操作,并选择其中一个可用的通道进行操作。 select语句的语法如下:

select {
    case <-channel1:
        // 执行channel1的操作
    case data := <-channel2:
        // 执行channel2的操作,同时将通道中的数据赋值给data变量
    case channel3 <- data:
        // 将data写入channel3
    default:
        // 当没有任何通道操作时执行default语句
}

  select语句中可以包含多个case子句,每个case子句表示一个通道操作。<-符号用于从通道中读取数据,channel <- data用于将数据写入通道。 select语句的执行流程为:

  • 如果有多个通道都可以操作,则随机选择一个进行操作。

  • 如果没有任何通道可以操作,则会执行default语句(如果有)。

  • 如果没有default语句,则select语句会阻塞,直到至少有一个通道可以操作。

  下面是一个使用select语句的示例:

package main
import (
    "fmt"
    "time"
)
func main() {
    ch1 := make(chan int)
    ch2 := make(chan int)
    go func() {
        time.Sleep(time.Second)
        ch1 <- 1
    }()
    go func() {
        time.Sleep(2 * time.Second)
        ch2 <- 2
    }()
    select {
    case data := <-ch1:
        fmt.Println("收到ch1的数据:", data)
    case data := <-ch2:
        fmt.Println("收到ch2的数据:", data)
    default:
        fmt.Println("没有任何通道操作")
    }
}

  在上面的例子中,我们创建了两个通道ch1ch2,并分别在不同的goroutine中向它们发送数据。然后使用select语句监听这两个通道的操作,当其中一个通道可用时,就会执行对应的case语句。

  在这个例子中,由于ch1的数据发送操作会在1秒后执行,而ch2的数据发送操作会在2秒后执行,因此select语句会等待1秒后,执行ch1case语句,输出"收到ch1的数据: 1"。如果我们将ch1的发送操作改为在2秒后执行,那么select语句将会等待2秒后,执行ch2case语句,输出"收到ch2的数据: 2"。

  需要注意的是,select语句的执行顺序是随机的,所以不能依赖于某个通道的操作先于其他通道。这也是使用select语句时需要注意的地方之一。

  如果希望持续监听多个通道的操作,可以将select语句放在一个无限循环中。

package main
import (
    "fmt"
    "time"
)
func main() {
    channel1 := make(chan int)
    channel2 := make(chan string)
    go func() {
        for i := 0; i < 5; i++ {
            time.Sleep(time.Second)
            channel1 <- i
        }
        close(channel1)
    }()
    go func() {
        for i := 0; i < 5; i++ {
            time.Sleep(time.Second)
            channel2 <- fmt.Sprintf("Message %d", i)
        }
        close(channel2)
    }()
    for {
        select {
        case data1, ok := <-channel1:
            if ok {
                fmt.Println("Received from channel1:", data1)
            } else {
                fmt.Println("Channel1 closed")
                channel1 = nil
            }
        case data2, ok := <-channel2:
            if ok {
                fmt.Println("Received from channel2:", data2)
            } else {
                fmt.Println("Channel2 closed")
                channel2 = nil
            }
        }
        if channel1 == nil && channel2 == nil {
            break
        }
    }
    fmt.Println("Done")
}

  在这个示例中,创建了两个通道channel1channel2,分别用于发送不同类型的数据。然后分别启动两个goroutine,每个goroutine向对应的通道发送一些数据,然后关闭通道。其运行得结果如图:

  

                        

  在主函数中,我们使用无限循环和select语句来持续监听这两个通道的操作。每次循环时,select语句会选择其中一个可用的通道进行操作。如果通道关闭,我们会将对应的通道设置为nil,以便在后续的循环中跳过该通道的操作。当两个通道都关闭,即channel1channel2都为nil时,我们跳出循环,程序结束。

  运行上述代码,你会看到程序持续监听两个通道的操作,并打印接收到的数据,直到两个通道都关闭。最后,程序输出"Done"并结束。

 

 

 

 

标签:总结,语句,ch1,case,go,操作,select,通道
From: https://www.cnblogs.com/zjdxr-up/p/17530604.html

相关文章

  • 崇明区一模卷错题总结
    1.advisetodo2.forgetful健忘的3.被动语态不会被动语态:1,一般现在时:am,is,are+动词过去分词例如:Theballisplayed,everyday这个球每天被踢2,一般过去时:was,were+动词过去分词Theballwasplayed,yesterday这个球昨天被踢3,一般将来时:willbe+动词过去分......
  • 7.5总结
    今天早上依旧和往常一样醒的比较晚就没吃早饭,早上起来自己泡了个方便面吃,吃完泡面就不早了就,打了会游戏就中午了,中午吃完饭后发现有点困,就简单的睡了个午觉,醒了之后就学习了会java,主要是看的学习视频,没啥大问题,学了一会就去练车了,我真的吐了,热的要死啊,练车练完之后就不早了,就回家......
  • python: Ten Sort Algotrthms
     #encoding:utf-8#Author:geovindu,GeovinDu涂聚文.#IDE:PyCharm2023.1python11#Datetime:2023/7/220:25#User:geovindu#Product:PyCharm#Project:pythonStudyDemo#File:TenSortAlgotrthms.py#explain:学习......
  • GOPEED, 一款支持全平台的下载器
    GOPEED,一款支持全平台的下载器开源、轻量、原生,支持(HTTP、BitTorrent、Magnet等)协议下载。下载地址下载首页......
  • 每日总结2023年7月5日
    今日学习:页式存储(逻辑地址:页号+页内地址):逻辑地址和物理地址间的转换。优点:利用率高,便于管理。缺点:增加系统开销,可能产生抖动现象。段式存储(逻辑地址:段号+段内地址):优点:便于共享。缺点:内存利用率低。段页式存储:优点:空间浪费小,共享容易。缺点:增加软件复杂度,增加开销。块表:一块小容量......
  • 7月5日模拟赛赛后总结
    爆零模拟赛。T1Gym101078F搜索入门题吧,套了一层交互而已。但教练让我们手动模拟计算机交互,烦死了。但为什么有人直到比赛结束了才搞懂这道题交互的格式啊!先dfs把整张图问出来,然后bfs棋盘找最短路,就完了。犯了几个经典错误:多测不清空没判错解数组开小该打T2Gym104......
  • go语言的"面向对象"
    面向对象定义面向对象三要素:封装:将属性(数据)和方法(操作)封装,提供访问控制,隐藏实现细节,暴露该暴露的继承:子类可以从父类直接获得属性和方法,减少重复定义。子类中如果与父类不同,可以自己定义新的属性和方法,也可以覆盖同名的属性和方法多态:前提是继承和覆盖,使得子类中虽然使用同......
  • go语言结构体排序
    排序接口从接口定义来看,要实现某类型的排序要知道有多少个元素2个指定索引的元素怎么比较大小,索引i的元素小于索引j的值返回true,反之返回false如何交换指定索引上的元素那么自定义类型,要想排序,就要实现sort包中该接口。结构体排序 假设有N个学生,学生有姓名和年龄,按照年龄......
  • 每日总结(7.5)
    一、今日收获(1)学习了java俩小时;(2)阅读了半小时《大道至简》;(3)和朋友出去聚了餐;二、明日计划(1)准备7号的科目一考试;(2)继续学习java;(3)学习数据结构知识;......
  • Visual Studio2019 BackgoroundImageLayout属性
    ​BackgroundImageLayout属性值背景图片重复:BackgroundImageLayout属性设置为Tile(默认)背景图片左边显示:BackgroundImageLayout属性设置为None背景图片右边显示:BackgroundImageLayout属性设置为None,同时RightToLeft属性设置为Yes背景图片居中显示:BackgroundImageLayout属性设......