gpt4 book ai didi

go - time.NewTimer 没有像我预期的那样工作

转载 作者:IT王子 更新时间:2023-10-29 01:57:02 24 4
gpt4 key购买 nike

我有一个相当简单的程序,它应该在指定的持续时间(例如,一秒)后自行终止

代码:

package main

import (
"fmt"
"time"
)

func emit(wordChannel chan string, done chan bool) {
defer close(wordChannel)

words := []string{"The", "quick", "brown", "fox"}
i := 0
t := time.NewTimer(1 * time.Second)

for {
select {
case wordChannel <- words[i]:
i++
if i == len(words) {
i = 0
}
// Please ignore the following case
case <-done:
done <- true
// fmt.Printf("Got done!\n")
close(done)
return
case <-t.C:
fmt.Printf("\n\nGot done!\n\n")
return
}
}
}

func main() {

mainWordChannel := make(chan string)
// Please ignore mainDoneChannel
mainDoneChannel := make(chan bool)

go emit(mainWordChannel, mainDoneChannel)

for word := range mainWordChannel {
fmt.Printf("%s ", word)
}

}

我编译执行二进制,可以看到执行here .

这显然超过了 1 秒。

关于 NewTimer 的 Go 文档读到:

func NewTimer

func NewTimer(d Duration) *Timer

NewTimer creates a new Timer that will send the current time on its channel after at least duration d.

有人可以帮助我了解这里发生的事情吗?为什么程序没有在 1 秒后准确终止(或接近至少)?

最佳答案

计时器按预期工作。它向 channel 发送一个值。我认为阅读 about select statement 很有用循环中的每次迭代都可以写入 channel 。如果可以进行 > 1 次通信,则无法保证哪些是。因此,如果像这样向读取循环添加延迟:

for word := range mainWordChannel {
fmt.Printf("%s ", word)
time.Sleep(time.Millisecond)
}

在这种情况下,只有从timer.C 读取才能继续。程序将结束。

关于go - time.NewTimer 没有像我预期的那样工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50774668/

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