昨天写代码的时候发现有一段代码的本应该是两秒的ticker足足10分钟才触发下一次的任务,具体原因在哪里也不清楚,应该是某处的bug了,但是我在测试的时候发现了一些不太理解的问题,求大佬能解惑。贴代码和执行结果:
有疑问加站长微信联系(非本文作者)

昨天写代码的时候发现有一段代码的本应该是两秒的ticker足足10分钟才触发下一次的任务,具体原因在哪里也不清楚,应该是某处的bug了,但是我在测试的时候发现了一些不太理解的问题,求大佬能解惑。贴代码和执行结果:
有疑问加站长微信联系(非本文作者)
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
`单行代码`
结果是ticker1的stop没有任何用,但是我看stop方法传入的也是指针啊
time.NewTicker 返回的就是一个 *Ticker,你再取一次指针操作没有必要,我修改了一下代码,
ticker.stop() 被调用了,但是没有停止,估计是和你取了两次指针操作有关
不要滥用指针,在Go里面如无必要不用指针。
这句不是再取一次指针,正相反,*是从指针中取值。然后赋值给ticker,我感觉应该是发生了值复制,导致ticker.Stop()停不掉。 具体不太了解底层实现。
time.NewTicker返回的是一个指针,你用 *time.NewTicker 等于是拷贝了结构体值,然而结构体里面除了 C,还有一个runtimeTimer,这个也被拷贝了,大概这就是stop无法生效的原因吧。
总结:闲的蛋疼
取值啊大哥。。。。
你们真的是认真的吗。。。。。我明明是取值,并没有取指针啊
的确是拷贝了啊,但是我range的值也是拷贝以后的结构体中的C,应该也是可以停止的啊
ticker := *time.NewTicker(time.Second)
这里取得ticker不是pointer了...so????所以问题在哪里?
你要看下,go 的用法,go执行匿名闭包函数时,传值的时候默认是拷贝传值的,你用*time.Newticker相当于传的就是一个值类型的拷贝,go func里面的ticker跟外面定义的不是一个了,是一个拷贝,之前的ticker是一个指针,所以拷贝指向的还是同一个ticker,你现在stop的只是拷贝的一个ticker,不是外面的那个,你可以打印一下两个ticker的内存地址,看看不是同一个了
汗,搞错了,闭包函数的变量是引用传递的,按理说是一个东西,那估计就是Stop的内部处理方式了,我看了下是要求参数是指针的,传个非指针进去估计就不行了