美文网首页
golang select

golang select

作者: 哈哈_dfde | 来源:发表于2020-09-07 14:57 被阅读0次

使用场景

  select主要用来监控多个channel,channel的数据读取,写入,关闭等事件,采用的是轮训算法

监控事件

   channel读取事件
   channel的写入事件
   channel关闭事件
   其他default

读取事件

func addNumberToChan(chanName chan int) {
for {
    chanName <- 1
    time.Sleep(1 * time.Second)
}
}
// select 监控channel的push事件
  func testReadChannel()  {
var chan1 = make(chan int, 10)
var chan2 = make(chan int, 10)
go addNumberToChan(chan1)
go addNumberToChan(chan2)
for {
    select {
    case e := <- chan1 :
        fmt.Printf("Get element from chan1: %d\n", e)
    case e := <- chan2 :
        fmt.Printf("Get element from chan2: %d\n", e)
    default:
        fmt.Printf("No element in chan1 and chan2.\n")
        time.Sleep(1 * time.Second)
    }
}
}

写入事件

 func testAddChannel()  {
   var chan1 = make(chan int, 10)
   var chan2 = make(chan int, 10)

    chan1 <- 1
    chan2 <- 0
//go addNumberToChan(chan1)
//go addNumberToChan(chan2)

for {
    select {
    case chan1 <- 1 :
        fmt.Printf("Get element from chan1: 1")
    case chan2 <- 0 :
        fmt.Printf("Get element from chan2: 0")
    default:
        fmt.Printf("No element in chan1 and chan2.\n")
        time.Sleep(1 * time.Second)
    }
}

}

PS:注意select语句如果做监听使用的话,尽量嵌套在for循环中,因为单独的select是阻塞的,并且是又返回值的,eg:

   func server1(ch chan string) {
time.Sleep(1 * time.Second)
ch <- "from server1"
   }
   func server2(ch chan string) {
time.Sleep(1 * time.Second)
ch <- "from server2"

   }
   func main() {
output1 := make(chan string,1)
output2 := make(chan string,1)
go server1(output1)
go server2(output2)
select {
case s1 := <-output1:
    fmt.Println(s1)
case s2 := <-output2:
    fmt.Println(s2)
    }

这个程序的结果要么是“from server1”或者“from server2”,因为select读取到一个数据后就返回了

相关文章

  • select I/O多路复用

    select golang的并发模型和linux select类似golang提供了select关键字,实现I/O...

  • Go语言常用代码笔记(持续更新)

    ?循环读取Channel内容 ?golang 的 select 的功能和 select, poll, epoll ...

  • golang select

    使用场景 监控事件 读取事件 写入事件 } PS:注意select语句如果做监听使用的话,尽量嵌套在for循环中,...

  • Go select

    通过select语句可以监听channel上的数据流动 Golang的select语句类似于UNIX的select...

  • select用法

    golang 的 select 的功能和select, poll, epoll相似, 就是监听 IO 操作,当 I...

  • golang select总结

    官方文档及理解 每个case都必须是一个通信 所有channel表达式都会被求值 所有被发送的表达式都会被求值 如...

  • golang select 小结

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

  • Golang select 语句

    select 是 Go 中的一个控制结构,类似于用于通信的 switch 语句。每个 case 必须是一个通信操作...

  • select详解

    语法具体定义参考官方定义 https://golang.org/ref/spec#Select_statement...

  • golang channel & select

    通过消息来共享数据是golang的一种设计哲学,channel则是这种哲理的体现.channel定义 dataTy...

网友评论

      本文标题:golang select

      本文链接:https://www.haomeiwen.com/subject/nmnqektx.html