Go语言 Select 详细解读

Go Select 详解

select语句让多个channel操作等待

Go的select语句让程序线程在多个channel的操作上等待,select语句在goroutine 和channel结合的操作中发挥着关键的作用。介绍一个小程序,演示这个select功能。

这个程序模拟接受消息功能,有两个channel接受发送过来的消息。select语句用来接受两个某个消息,for循环表示仅接受3个消息。

package main

import (
    "time"
    "log"
    "strconv"
)

func receiveMsg(){
    c1 := make(chan string)
    c2 := make(chan string)
    t1 := time.Now() // get current time
    go func(){
        //received three message
        for i:=0; i < 3; i++ {
            time.Sleep(time.Millisecond * 150)
            c1 <- "msg 1 with index " + strconv.Itoa(i)
        }
    }()
    go func(){
        for j:=0; j < 3; j++ {
            time.Sleep(time.Millisecond * 200)
            c2 <- "msg 2 with index "+ strconv.Itoa(j)
        }
    }()

    //print two message
    for i:= 0; i < 3; i++ {
        select {
        case msg1 := <- c1:
            log.Println("received msg :", msg1)
        case msg2 := <- c2:
            log.Println("received msg :", msg2)
        }
    }
    elapsed := time.Since(t1)
    log.Println("time elapsed ", elapsed)

}
func main() {
    receiveMsg()
}

输出结果:

2017/02/16 10:55:51 received msg : msg 1 with index 0
2017/02/16 10:55:51 received msg : msg 2 with index 0
2017/02/16 10:55:51 received msg : msg 1 with index 1
2017/02/16 10:55:51 time elapsed  300.03ms

从结果来看,总时间为300多ms,goroutine并发执行对应的休眠时间后,select语句顺利获取对应消息,并打印消息日志。

select随机选择操作

select可以让多个交流操作等待,结合for永久循环,select保证它的case之一能够执行前发生阻塞。 当多个操作都准备好时,select随机选择一个case执行。

下面将介绍一个小程序,演示select的这个功能。

package main

import (
    "log"
    "fmt"
)


func fibonacci(c, quit chan int) {
    x, y := 0, 1
    for {
        select {
        case c <- x:
            x, y = y, x+y
        case <-quit:
            fmt.Println("quit")
            return
        }
    }
}

func exeFibonacci(){
    c := make(chan int)
    quit := make(chan int)

    //produce data
    go func(){
        for i:= 0; i < 10; i++ {
            log.Println("channel data item ", <- c)
        }
        quit <- 0
    }()
    fibonacci(c, quit)
}

func main() {
    exeFibonacci()
}

输出结果:

2017/02/16 11:35:49 channel data item  0
2017/02/16 11:35:49 channel data item  1
2017/02/16 11:35:49 channel data item  1
2017/02/16 11:35:49 channel data item  2
2017/02/16 11:35:49 channel data item  3
2017/02/16 11:35:49 channel data item  5
2017/02/16 11:35:49 channel data item  8
2017/02/16 11:35:49 channel data item  13
2017/02/16 11:35:49 channel data item  21
2017/02/16 11:35:49 channel data item  34
quit

channel中的每个数字即为fibonacci值(select语句中的x变量值)。

default

select的default语句与Java中的switch一样,表示默认情况下的执行case。下面的例子介绍了具体的使用情况。

package main

import (
    "fmt"
    "time"
)

func main() {
    tick := time.Tick(100 * time.Millisecond)
    boom := time.After(500 * time.Millisecond)
    for {
        select {
        case <-tick:
            fmt.Println("tick.")
        case <-boom:
            fmt.Println("BOOM!")
            return
        default:
            fmt.Print(".")
            time.Sleep(50 * time.Millisecond)
        }
    }
}

运行结果:

..tick.
..tick.
..tick.
..tick.
..BOOM!

欢迎订阅微信公众号

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
HCIP实验100是华为认证网络专家(Huawei Certified IP Professional)培养计划的一部分,是其可供选择的实验之一。综合实验的目的是为了让学员在真实的网络环境中应用所学知识和技能,通过解决实际问题来提升他们的专业能力。 在这项实验中,学员将面临一个综合的网络实景场景,需要通过设计、规划和操作来构建和维护一个复杂的网络架构。实验内容包括网络设备的安装调试、网络拓扑的设计与优化、网络服务的配置与管理等。 在实验过程中,学员需要通过分析业务需求,理解网络架构,制定相应的方案。在网络设备安装调试阶段,学员需要进行硬件组装、设备配置操作,并进行相关测试和调整,以确保设备正常工作。在网络拓扑设计与优化阶段,学员需要考虑网络规模、性能需求、容灾能力等因素,并利用各项技术手段进行设计和优化。在网络服务配置与管理阶段,学员需要完成各种网络服务的配置,如IP地址分配、路由协议配置、安全策略配置等。 这个实验对学员的要求非常高,在实验过程中,学员需要综合应用他们所学的各种知识和技能,如网络硬件的安装与调试、网络拓扑设计与规划、网络服务配置与管理等。同时,学员需要具备良好的沟通能力、问题解决能力和团队协作能力,以便在解决问题时能与他人有效合作。 通过完成HCIP实验100综合实验,学员将对网络架构的设计和实施有更深入的理解,提升了技术能力和实践经验,为日后从事网络相关工作打下了坚实的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值