关于golang time.Ticker的一个问题

ysh0566 · 2018-05-22 10:42:02 · 2432 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2018-05-22 10:42:02 的主题,其中的信息可能已经有所发展或是发生改变。

昨天写代码的时候发现有一段代码的本应该是两秒的ticker足足10分钟才触发下一次的任务,具体原因在哪里也不清楚,应该是某处的bug了,但是我在测试的时候发现了一些不太理解的问题,求大佬能解惑。贴代码和执行结果: QQ20180522-0.png


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2432 次点击  
加入收藏 微博
12 回复  |  直到 2018-05-28 11:21:44
ysh0566
ysh0566 · #1 · 7年之前

结果是ticker1的stop没有任何用,但是我看stop方法传入的也是指针啊

AceDarkkinght
AceDarkkinght · #2 · 7年之前

time.NewTicker 返回的就是一个 *Ticker,你再取一次指针操作没有必要,我修改了一下代码,

    go func() {
        time.Sleep(3 * time.Second)
        fmt.Println("--start stop--")
        ticker.Stop()
        fmt.Println("--end stop--")
    }()

ticker.stop() 被调用了,但是没有停止,估计是和你取了两次指针操作有关

linkerlin
linkerlin · #3 · 7年之前

不要滥用指针,在Go里面如无必要不用指针。

tk103331
tk103331 · #4 · 7年之前
ticker := *time.NewTicker(time.Second)

这句不是再取一次指针,正相反,*是从指针中取值。然后赋值给ticker,我感觉应该是发生了值复制,导致ticker.Stop()停不掉。 具体不太了解底层实现。

keepeye
keepeye · #5 · 7年之前

time.NewTicker返回的是一个指针,你用 *time.NewTicker 等于是拷贝了结构体值,然而结构体里面除了 C,还有一个runtimeTimer,这个也被拷贝了,大概这就是stop无法生效的原因吧。

总结:闲的蛋疼

ysh0566
ysh0566 · #6 · 7年之前
AceDarkkinghtAceDarkkinght #2 回复

time.NewTicker 返回的就是一个 *Ticker,你再取一次指针操作没有必要,我修改了一下代码, ```go go func() { time.Sleep(3 * time.Second) fmt.Println("--start stop--") ticker.Stop() fmt.Println("--end stop--") }() ``` ticker.stop() 被调用了,但是没有停止,估计是和你取了两次指针操作有关

取值啊大哥。。。。

ysh0566
ysh0566 · #7 · 7年之前
linkerlinlinkerlin #3 回复

不要滥用指针,在Go里面如无必要不用指针。

你们真的是认真的吗。。。。。我明明是取值,并没有取指针啊

ysh0566
ysh0566 · #8 · 7年之前
keepeyekeepeye #5 回复

time.NewTicker返回的是一个指针,你用 *time.NewTicker 等于是拷贝了结构体值,然而结构体里面除了 C,还有一个runtimeTimer,这个也被拷贝了,大概这就是stop无法生效的原因吧。 总结:闲的蛋疼

的确是拷贝了啊,但是我range的值也是拷贝以后的结构体中的C,应该也是可以停止的啊

barryz
barryz · #9 · 7年之前

ticker := *time.NewTicker(time.Second) 这里取得ticker不是pointer了...

ysh0566
ysh0566 · #10 · 7年之前
barryzbarryz #9 回复

`ticker := *time.NewTicker(time.Second)` 这里取得ticker不是pointer了...

so????所以问题在哪里?

786789256
786789256 · #11 · 7年之前

你要看下,go 的用法,go执行匿名闭包函数时,传值的时候默认是拷贝传值的,你用*time.Newticker相当于传的就是一个值类型的拷贝,go func里面的ticker跟外面定义的不是一个了,是一个拷贝,之前的ticker是一个指针,所以拷贝指向的还是同一个ticker,你现在stop的只是拷贝的一个ticker,不是外面的那个,你可以打印一下两个ticker的内存地址,看看不是同一个了

786789256
786789256 · #12 · 7年之前

汗,搞错了,闭包函数的变量是引用传递的,按理说是一个东西,那估计就是Stop的内部处理方式了,我看了下是要求参数是指针的,传个非指针进去估计就不行了

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传