2

几天前我刚开始学习Golang,我似乎无法弄清楚是否可以突破时间。Sleep()...

我可以返回/跳出 for 循环,但函数不会返回,因为 Sleep 继续做它的事情。

我猜解决方案很简单,但我似乎找不到答案。

func main() {
  ticker := time.NewTicker(time.Second * 1)

  go func() {
    for i := range ticker.C {
      fmt.Println("tick", i)
      ticker.Stop()
      break
    }
  }()
  time.Sleep(time.Second * 10)
      ticker.Stop()

  fmt.Println("Hello, playground")
}

提前致谢!

4

2 回答 2

6

听起来您想向主 goroutine 发送一条消息,告诉它您的另一个 goroutine 已完成。为此,渠道是最好的选择。

func main() {
    ticker := time.NewTicker(time.Second)
    done := make(chan bool, 1)

    go func() {
        for i := range ticker.C {
            fmt.Println("tick", i)
            ticker.Stop()
            break
        }

        done <- true
    }()

    timer := time.NewTimer(time.Second/2)
    select {
    case <-done:
        timer.Stop()
    case <-timer.C:
        ticker.Stop()
    }

    fmt.Println("Done")
}

http://play.golang.org/p/5NFsvC5f7P的工作示例

当计时器大于ticker时,它会滴答作响。当它小于时,你所看到的都是“完成”。

于 2013-08-19T06:24:13.000 回答
-2

这可能不是一个非常具体的解决方案,但您可以应用它。

我理解它的方式是,您需要在特定条件下打破计时器。

试着在你的睡眠周围放一个while循环,让它睡一秒钟

将条件设置为函数上的布尔值

while (condition_to_sleep)
{
    time.Sleep(1000);
}

这样,您可以在需要时打破计时器

希望这有帮助:)

于 2013-08-19T05:55:16.073 回答