【golang笔记】go_channel的select(27)

Page content

这一篇简单的整理了golang channel的select 相关的内容。

1.select 介绍

管道(channel)实现了多个goroutine之前的同步或者通信,
select实现了多个管道(channel)的同步或者通信,并且select具有阻塞的特性。

package main

import (
 "fmt"
)

func main() {

 //使用select可以解决从管道取数据的阻塞问题

 //1.定义一个管道 10个数据int
 intChan := make(chan int, 10)
 for i := 0; i < 10; i++ {
  intChan <- i
 }
 //2.定义一个管道 5个数据string
 stringChan := make(chan string, 5)
 for i := 0; i < 5; i++ {
  stringChan <- "hello" + fmt.Sprintf("%d", i)
 }

 //传统的方法在遍历管道时,如果不关闭会阻塞而导致 deadlock

 //问题,在实际开发中,可能我们不好确定什么关闭该管道.
 //可以使用select 方式可以解决
 //label:
 for {
  select {
  //注意: 这里,如果intChan一直没有关闭,不会一直阻塞而deadlock
  //,会自动到下一个case匹配
  case v := <-intChan:
   fmt.Printf("从intChan读取的数据%d\n", v)
  case v := <-stringChan:
   fmt.Printf("从stringChan读取的数据%s\n", v)
  default:
   close(intChan)
   close(stringChan)
   fmt.Printf("都取不到了,不玩了, 程序员可以加入逻辑\n")
   return
   //break label
  }
 }
}

欢迎大家的意见和交流

email: li_mingxie@163.com