golang select 小结

select 介绍

从不同并发执行的协程中,获取数据可以用select来完成。select监听的多个通道,也可以用通道发送数值。

select {
// 接收数据
case u:= <- ch1:
        ...
// 发送数据
case v:= <- ch2:
        ...
        ...
default: // no value ready to be received
        ...
}

select 基本用法

1、如果多个通道都阻塞了,会等待知道其中一个通道可以处理。
2、如果多个通道都可以处理,随机选取一个处理。
3、如果没有通道操作可以操作并且写了default语句,会执行:default(永远是可以运行的)
4、如果防止select堵塞,可以写default来确保发送不被堵塞,没有case的select就会一直堵塞。
5、当select做选择case和default操作时,case的优先级大于default。
6、select语句实现了一种监听模式,通常在无限循环中使用,通过在某种情况下,通过break退出循环。

示例1

package main

import (
    "time"
    "fmt"
)

func doneSelect(ch chan int)  {
    for  {
        fmt.Println("for循环-输出-start")
        select {
        case data := <-ch:
            fmt.Println(data)
            break // 使用break只会跳出select
            //return   使用return会跳出for循环
        default:
            fmt.Println("select default testing")
        }
        fmt.Println("for循环-结束-end")
    }
    fmt.Println("for循环-跳出-end")
}
func do()  {
    ch := make(chan int)
    go doneSelect(ch)
    ch <- 666
}
func main()  {
    do()
    time.Sleep(3*time.Second)
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。 O...
    我想起个好名字阅读 5,484评论 0 9
  • 你是否心里也住着一个人,遥远的爱着,远到这辈子都没法在一起。可是就是这个遥远的人支撑了青春里最重要,最温暖...
    小慢菇凉阅读 241评论 0 0
  • 原创211 亲爱的老公, 时间过得真快啊, 转眼我们一起生活了16年。 祝我们的“蓝宝石婚纪念日”快乐! 或许是缘...
    MAY聆听诗语阅读 1,413评论 17 13
  • 他们的爱情怎能就这样凭空消失?爱是何时离开的?又去了哪里?爱情,莫非像影子一样,有人踩中了,就带着离去?还是因为爱...
    暖迹阅读 456评论 2 2
  • 好想回到小时~ 【一】手绘日签图 【冉绘】•【禅绕画】•【早安心语】 『若有才华藏于心,岁月从不败美人。』 『fr...
    冉听花开阅读 176评论 0 4