【Go 语言社区】关于select和channel数组的配合使用--转
时间:2022-05-04
本文章向大家介绍【Go 语言社区】关于select和channel数组的配合使用--转,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
package main
import (
"fmt"
"math/rand"
"reflect"
"time"
)
type (
product struct {
id int // 生产者序号
val int // 产品
}
producer struct {
id int // 序号
chnl chan *product
}
)
var (
producerList []*producer
notifynew chan int
updatedone chan int
)
func main() {
rand.Seed(time.Now().Unix())
notifynew = make(chan int, 1)
updatedone = make(chan int, 1)
ticker := time.NewTicker(time.Second)
cases := update(ticker)
for {
chose, value, _ := reflect.Select(cases)
switch chose {
case 0: // 有新的生产者
cases = update(ticker)
updatedone <- 1
case 1:
// 创建新的生产者
if len(producerList) < 5 {
go newproducer()
}
default:
item := value.Interface().(*product)
fmt.Printf("消费: 值=%d 生产者=%dn", item.val, item.id)
}
}
}
func update(ticker *time.Ticker) (cases []reflect.SelectCase) {
// 新生产者通知
selectcase := reflect.SelectCase{
Dir: reflect.SelectRecv,
Chan: reflect.ValueOf(notifynew),
}
cases = append(cases, selectcase)
// 定时器
selectcase = reflect.SelectCase{
Dir: reflect.SelectRecv,
Chan: reflect.ValueOf(ticker.C),
}
cases = append(cases, selectcase)
// 每个生产者
for _, item := range producerList {
selectcase = reflect.SelectCase{
Dir: reflect.SelectRecv,
Chan: reflect.ValueOf(item.chnl),
}
cases = append(cases, selectcase)
}
return
}
func newproducer() {
newitem := &producer{
id: len(producerList) + 1,
chnl: make(chan *product, 100),
}
producerList = append(producerList, newitem)
notifynew <- 1
<-updatedone
go newitem.run()
}
func (this *producer) run() {
for {
time.Sleep(time.Duration(int(time.Millisecond) * (rand.Intn(1000) + 1)))
item := &product{
id: this.id,
val: rand.Intn(1000),
}
fmt.Printf("生产: 值=%d 生产者=%dn", item.val, item.id)
this.chnl <- item
}
}
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 云开发 X 涂鸦:当小程序遇见物联网IoT,几行代码搞定智能插座控制
- Spring、SpringMVC和SpringBoot看这一篇就够了!
- React结合Redux实现Todolist
- JS事件,你真的懂吗(捕获,冒泡)?
- iptables速查
- React高级特性解析
- Mobx+Mobx-React快速上手 简单可扩展的状态管理解决方案
- PB数据毫秒级搜索之Elasticsearch(二)基础了解
- 设计模式 | 策略模式
- 设计模式 | 装饰模式
- Laravel实现redis发布-订阅
- Java Lambda表达式
- PHP后期静态绑定
- 网络OSI七层模型
- javaScript 原生DOM节点操作(最实用的dom节点操作大全)