前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >go基础入门之 select(多路复用)

go基础入门之 select(多路复用)

作者头像
大话swift
发布2019-07-25 16:27:29
4980
发布2019-07-25 16:27:29
举报
文章被收录于专栏:大话swift大话swift

之前我们停车模拟采用的switch来随机生成0 1 模拟进行enter leave,现在我们采用select进行分支切换。那么什么是select呢?select会随机的执行一个channel或者default,从而能够使每个channel能够有均等的执行概率

代码语言:javascript
复制

type Bus int

var station = 50

func leave() <-chan Bus {
  defer time.Sleep(time.Microsecond*500)

  bus := make(chan Bus,1)
  defer close(bus)
  if station > 0 {
    bus <- -1
    return bus
  } else {
    bus <- 0
  }
  return bus
}
func enter() chan Bus {
  en := make(chan Bus,1)
  defer close(en)
  if station == 50{
    en <- 0
  }else {

    en <- 1
  }
  defer time.Sleep(time.Microsecond*500)
  return en
}
func main() {

  for station>0 {
    select {
    case en:= <-enter():
      if en == 0 {
        fmt.Println("can not enter")
         continue
      }
      station += int(en)
      fmt.Println("enter station:",station)

    case value := <-leave():
      if value==0 {
        fmt.Println("is empty")
        continue
      }
      station += int(value)
      fmt.Println("leave station:",station)

    }
  }

}

对于一个station车进出事随机的,正好符合我们的select执行规律。对于上文怎么我们采用for来进行无下限的循环等待。那么对于select怎么样去结束一个执行呢?break是常用的方式。然而break只是结束了内部的select并不能控制完部的for。因此,怎么正确的退出一个select循环呢?我们看下例解决

代码语言:javascript
复制
a := make(chan bool)
loop:
  for {
    select {
    case <-a:
      break loop

    }
  }

在for的外层设置一个loop的循环标志,当需要完全退出的时候break loop即可完全退出select和for的循环

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-07-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大话swift 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档