golang中管道替换问题

https://blog.csdn.net/cyk2396/article/details/78875347

1.运行以下代码:

var chan1 chan int

var chanLength int = 18

var interval time.Duration = 1500 * time.Millisecond

//var interval2 time.Duration = 1800 * time.Millisecond

//golang在替换通道时引起的问题

func main() {

chan1 = make(chan int, chanLength)

//该goroutine是每隔1.5秒向chan1中发送一个元素

//当满足条件时,重置chan1,此时chan1会指向一个新通道

go func() {

for i := 0; i < chanLength; i++ {

if i > 0 && i%3 == 0 {

fmt.Println("chan1 reset")

chan1 = make(chan int, chanLength)

}

fmt.Println("send an value : ", i)

chan1 <- i

time.Sleep(interval)

}

fmt.Println("close chan1")

close(chan1)

}()

//用于接收chan1中的元素
receive(chan1)

}

func receive(chan2 chan int) {

fmt.Println("start receive value from chan1 ...")

timer := time.After(30 * time.Second)

Loop:

for {

select {

case e, ok := <-chan2:

if !ok {

fmt.Println("chan1 has closed ...")

break Loop

}

		fmt.Println("receive value : ", e)
time.Sleep(interval)
case &lt;-timer:
fmt.Println("time out")
break Loop
}
}

}

结果如下:

start receive value from chan1 ...

send an value : 0

receive value : 0

send an value : 1

receive value : 1

send an value : 2

receive value : 2

chan1 reset

send an value : 3

send an value : 4

send an value : 5

chan1 reset

send an value : 6

send an value : 7

send an value : 8

chan1 reset

send an value : 9

send an value : 10

send an value : 11

chan1 reset

send an value : 12

send an value : 13

send an value : 14

chan1 reset

send an value : 15

send an value : 16

send an value : 17

close chan1

time out

引起这个的原因是:对变量的重新赋值操作是无法被传递的。在上面这个demo中,当chan1指向了新管道时,receive()函数还是调用原来的旧管道。

解决办法是:通过函数调用每次都获取最新的管道。代码如下:

var chan1 chan int

var chanLength int = 18

var interval time.Duration = 1500 * time.Millisecond

var interval2 time.Duration = 1550 * time.Millisecond

//golang在替换通道时引起的问题

func main() {

chan1 = make(chan int, chanLength)

//该goroutine是每隔1.5秒向chan1中发送一个元素

//当满足条件时,重置chan1,此时chan1会指向一个新通道

go func() {

for i := 0; i < chanLength; i++ {

if i > 0 && i%3 == 0 {

fmt.Println("chan1 reset")

chan1 = make(chan int, chanLength)

}

fmt.Println("send an value : ", i)

chan1 <- i

time.Sleep(interval)

}

fmt.Println("close chan1")

close(chan1)

}()

//用于接收chan1中的元素
receive()

}

func receive() {

fmt.Println("start receive value from chan1 ...")

timer := time.After(30 * time.Second)

Loop:

for {

select {

case e, ok := <-getChan(): //通过getChan()每次都获取最新的管道

if !ok {

fmt.Println("chan1 has closed ...")

break Loop

}

		fmt.Println("receive value : ", e)
time.Sleep(interval2) // 时间间隔相比发送方的时间间隔增加50ms,为了在getChan()时能获取最新的chan
case &lt;-timer:
fmt.Println("time out")
break Loop
}
}

}

//获取管道chan1

func getChan() chan int {

return chan1

}

golang中管道热替换的更多相关文章

  1. java中的动态加载和热替换

    https://blog.csdn.net/u010833547/article/details/54312052 ****************************************** ...

  2. Golang中的自动伸缩和自防御设计

    Raygun服务由许多活动组件构成,每个组件用于特定的任务.其中一个模块是用Golang编写的,负责对iOS崩溃报告进行处理.简而言之,它接受本机iOS崩溃报告,查找相关的dSYM文件,并生成开发者可 ...

  3. Java_类的热替换

    转自:http://www.ibm.com/developerworks/cn/java/j-lo-hotswapcls/#ibm-pcon Java ClassLoader 技术剖析 在本文中,我们 ...

  4. 使用自己的ClassLoader实现热替换

    首先实现一个自己的ClassLoader,该ClassLoader重写findClass方法. 从classpath中加载类资源. 注意,不要重写loadClass方法.  因为在使用自定义的MyCl ...

  5. 【转】class卸载、热替换和Tomcat的热部署的分析

    这篇文章主要是分析Tomcat中关于热部署和JSP更新替换的原理,在此之前先介绍class的热替换和class的卸载的原理.一 class的热替换ClassLoader中重要的方法 loadClass ...

  6. 基础知识 - Golang 中的正则表达式

    ------------------------------------------------------------ Golang中的正则表达式 ------------------------- ...

  7. class卸载、热替换和Tomcat的热部署的分析

    一 class的热替换 ClassLoader中重要的方法 loadClassClassLoader.loadClass(...) 是ClassLoader的入口点.当一个类没有指明用什么加载器加载的 ...

  8. Java 类的热替换---转载

    构建基于 Java 的在线升级系统 Java ClassLoader 技术剖析 在本文中,我们将不对 Java ClassLoader 的细节进行过于详细的讲解,而是关注于和构建在线升级系统相关的基础 ...

  9. 【webpack】-- 模块热替换

    全称是Hot Module ReplaceMent(HMR),理解成热模块替换或者模块热替换都可以吧,和.net中的热插拔一个意思,就是在运行中对程序的模块进行更新.这个功能主要是用于开发过程中,对生 ...

随机推荐

  1. Android使用JDBC连接数据库

    连接数据库是安卓开发中几乎不可避免的一项工作,稍有规模的应用通常都需要使用数据库来存储用户数据.对于本地数据库当然可以使用sqlite,而对于多用户线上应用,则一般需要配备云端数据库.其中比较常用且开 ...

  2. pyton学习之路

    文件操作 打开文件的模式有: r,只读模式(默认). w,只写模式.[不可读:不存在则创建:存在则删除内容:] a,追加模式.[可读:   不存在则创建:存在则只追加内容:] "+" ...

  3. 基于vue实现模糊匹配(这里以邮箱模糊匹配为例,其他的模糊匹配都可以类比)

    html部分(主要部分): js: data: methods: 效果图:

  4. LeetCode(46)Permutations

    题目 Given a collection of numbers, return all possible permutations. For example, [1,2,3] have the fo ...

  5. Vue如何实现swiper左右滑动内容区控制导航tab同时切换高亮

    Vue如何实现左右滑动内容区控制导航tab同时切换高亮,实现的效果是:点击导航按钮时内容区发生改变,左右滑动内容区时导航按钮跟随切换高亮,停留在某个内容区时刷新页面后仍然停留在当前内容区.       ...

  6. [网络流24题] 骑士共存(cogs 746)

    骑士共存问题«问题描述:在一个n*n个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示.棋盘 上某些方格设置了障碍,骑士不得进入. «编程任务:对于给定的n*n个方格的国际象棋棋盘和障碍标志 ...

  7. CF585E:Present for Vitalik the Philatelist

    n<=500000个2<=Ai<=1e7的数,求这样选数的方案数:先从其中挑出一个gcd不为1的集合,然后再选一个不属于该集合,且与该集合内任意一个数互质的数. 好的统计题. 其实就 ...

  8. Thinkphp5.0 的响应方式

    Thinkphp5.0 的响应方式 $res = config('default_return_type'); dump($res);//默认是html //修改为json \think\Config ...

  9. [bzoj2091][Poi2010]The Minima Game_动态规划

    The Minima Game bzoj-2091 Poi-2010 题目大意:给出N个正整数,AB两个人轮流取数,A先取.每次可以取任意多个数,直到N个数都被取走.每次获得的得分为取的数中的最小值, ...

  10. Caocao's Bridges-HDU4738(Tarjin+求桥)

    http://acm.hdu.edu.cn/showproblem.php?pid=4738 题目大意: 给定n个点和m条边  和每条边的价值,求桥的最小价值(最小桥) 看着挺简单的但是有好多细节: ...