golang中对time.NewTicker()返回的指针取值后调用Stop无法停止ticker
如图所示,代码不长,tickerTest1中对Ticker指针取值以后Stop没有反应,tickerTest2直接用返回的指针则没有任何问题。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
如图所示,代码不长,tickerTest1中对Ticker指针取值以后Stop没有反应,tickerTest2直接用返回的指针则没有任何问题。
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(2)
翻了下 runtime 包,发现在 stop 的时候有这么一个判断 :
关键在于
tb.t[i] != t
。如 @李毅 所说,如果使用tick := *time.NewTicker(time.Second)
是复制了一份,则这个条件肯定为真,即不释放该计时器资源,相当于没有 stop。所以计时器没有停止。大家都需要注意的是:不要对 Ticker.C 使用 range,因为在调用 Ticker.Stop 的时候并不会 close 该 channel,所以这里相当于一个死循环。
v2 = *p1
将产生新的结构体 v2,它的值由 p1 指针所指的结构体复制而来。因此,你在 tickerTest2() 中调用的 ticker.Stop() 并不是 time.NewTicker() 创建的那个,而是复制品。
举个例子参考下