gpt4 book ai didi

loops - 为什么我会在 golang 中使用 `case <-time.After(time.Second * 1):` 而不是 `time.Sleep(time.Second * 1)`

转载 作者:行者123 更新时间:2023-12-01 22:13:16 28 4
gpt4 key购买 nike

浏览一些代码,我发现了两种每秒做某事的方法:

for {
fmt.Println("This is printed every second")
time.Sleep(time.Second * 1)
}


for {
select {
case <-time.After(time.Second * 1):
fmt.Println("This is printed every second")
}
}

除了第一个更具可读性(在我看来)之外,我真的不明白一个比另一个的优势是什么。有人知道吗?

最佳答案

您可能想要这样做有(至少)两个原因:

  • time.Sleep总是阻塞你当前的 goroutine,而如果你包含一个默认情况,则可能不会在 channel 上等待:

  •     timeoutCh := time.After(time.Second)
    LOOP:
    for {
    select {
    case <-timeoutCh:
    break LOOP
    default:
    }
    // do some work
    }
  • 您可以使用它为长时间运行的操作添加超时。
    假设您的长期运营将在 channel 上通知您。在这种情况下,该操作的超时将像这样实现:

  •     opNotifyCh := op()
    select {
    case res := <-opNotifyCh:
    fmt.Println("Op finished with result:", res)
    case <-time.After(time.Second):
    fmt.Println("Op timed out")
    }
  • time.After给你一个 channel 。你可以用它做任何你想做的事——你可以将它传递给一个函数,你可以将它返回给一个调用者,你可以把它放在一个结构中——任何东西,真的。这给了你很大的自由。
  • 关于loops - 为什么我会在 golang 中使用 `case <-time.After(time.Second * 1):` 而不是 `time.Sleep(time.Second * 1)`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62246316/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com