我想每隔一段时间打印一些东西。但是我的代码不起作用,它会引发有关死锁的异常。
你能帮我吗?http://play.golang.org/p/pyEoXU-6Ee
func main() {
c := time.Tick(1 * time.Minute)
for now := range c {
fmt.Printf("%v \n", now)
}
}
我想每隔一段时间打印一些东西。但是我的代码不起作用,它会引发有关死锁的异常。
你能帮我吗?http://play.golang.org/p/pyEoXU-6Ee
func main() {
c := time.Tick(1 * time.Minute)
for now := range c {
fmt.Printf("%v \n", now)
}
}
Play.golang.org 有一些严格的规则来保护它。如果你在本地运行它,它可以工作。
这在https://play.golang.org/中不起作用的原因是因为time.Tick(...)
它是一个脏函数,它只能在以应用程序结束的无限循环中使用(或您不使用的其他用例)不介意泄漏内存)。根据 Golang 文档:
Tick 是 NewTicker 的便捷包装器,仅提供对 ticking 通道的访问。虽然 Tick 对于不需要关闭 Ticker 的客户端很有用,但请注意,如果没有办法关闭它,则底层 Ticker 无法被垃圾收集器恢复;它“泄漏”。与 NewTicker 不同,如果 d <= 0,Tick 将返回 nil。
所以一般最好time.NewTicker(...)
改用。参见示例:https ://pkg.go.dev/time#example-NewTicker
你可以试试这个:
package main
import "time"
import "fmt"
func main() {
ticker := time.NewTicker(time.Millisecond * 500)
go func() {
for t := range ticker.C {
fmt.Println("Tick at", t)
}
}()
time.Sleep(time.Millisecond * 1500)
ticker.Stop()
fmt.Println("Ticker stopped")
}