【问题标题】:Why golang ticker.Stop() does not work in tickerTest1?为什么 golang ticker.Stop() 在tickerTest1 中不起作用?
【发布时间】:2018-05-25 04:06:17
【问题描述】:

我知道Stop 功能无法关闭频道。我只是对tickerTest1tickerTest2 的两个不同结果感到困惑。

package main

import (
    "time"
    "log"
)

func tickerTest1() {
    ticker := *time.NewTicker(time.Second)
    count := 0
    go func() {
        time.Sleep(3*time.Second)
        ticker.Stop()
    }()
    for range ticker.C {
        count ++
        log.Println("tickerTest1:", count)
    }
}

func tickerTest2() {
    ticker := time.NewTicker(time.Second)
    count := 0
    go func() {
        time.Sleep(3*time.Second)
        ticker.Stop()
    }()
    for range ticker.C {
        count ++
        log.Println("tickerTest2:", count)
    }
}

func main() {
    go tickerTest1()
    tickerTest2()
}

【问题讨论】:

  • 将代码发布为文本。
  • 我认为问题是如果ticker是a pointer指向time.NewTicker(time.Second)的结果,为什么在ticker.Stop()之后继续发送tick到ticker.C
  • 因为停止副本不会停止实例。参加 Go 之旅,尤其是方法部分和指针部分。
  • 应始终避免使用文本的屏幕截图!而是复制并粘贴文本。
  • 我已经粘贴了文本。对此我很抱歉。

标签: go ticker


【解决方案1】:

tickerTest2() 按预期工作,所以让我们检查一下tickerTest1()

time.NewTicker() 返回一个指针值,一个*time.Ticker 类型的值。这已经暗示您应该将其用作:作为指针(并且不应取消引用它)。

但是,您使用间接运算符取消引用它:

ticker := *time.NewTicker(time.Second)

通过取消引用它,ticker 将是 time.Ticker 类型,一个非指针类型。它的值将是NewTicker() 返回的指针所指向的值的副本

仅此一点不会有问题,因为每当您调用带有指针接收器的方法(例如Ticker.Stop())时,Go 都会自动获取ticker 的地址。但是作为接收者传递的地址将是这个ticker变量的地址,任何修改time.Ticker结构的方法只会修改这个不同的副本,而不是返回指向的time.TickerNewTicker() 函数的值。

因此,实际上,您只停止了存储在ticker 变量中的副本Ticker,而不是由NewTicker() 返回的原始Ticker,它实际上是在通道上发送值。这仍然没有停止。

【讨论】:

    猜你喜欢
    • 2016-04-25
    • 2014-07-15
    • 1970-01-01
    • 1970-01-01
    • 2020-04-19
    • 1970-01-01
    • 2016-12-31
    • 1970-01-01
    相关资源
    最近更新 更多