Time 在Golang变量中,两个持续时间的乘积为零

Time 在Golang变量中,两个持续时间的乘积为零,time,go,Time,Go,在下面的Golang代码中,两个持续时间的乘积在变量“delay”中为零是很奇怪的,但是当不通过任何变量直接打印产品时,输出是预期的。有人能解释吗 func StartCleanTask() { go func() { delay := cfg.Config.Timeout * time.Second for { fmt.Println("Go clean task: ", delay, cfg.Config.Timeout*time.Se

在下面的Golang代码中,两个持续时间的乘积在变量“delay”中为零是很奇怪的,但是当不通过任何变量直接打印产品时,输出是预期的。有人能解释吗

 func StartCleanTask() {
  go func() {
       delay := cfg.Config.Timeout * time.Second
       for {
           fmt.Println("Go clean task: ", delay, cfg.Config.Timeout*time.Second)
           select {
           case <-time.After(cfg.Config.Timeout * time.Second):
               clean()
           }
     }
  }()
更新:

我还尝试运行以下代码,效果很好

package main 
import "fmt"
import "time"

func main() {

   var timeout time.Duration
   timeout = 100
   delay := timeout * time.Second

   fmt.Println("Go clean task: ", delay, timeout*time.Second)

}
再次更新:

保罗的回答被接受了。实际上,在cfg包的init函数中调用了startcleanstask(),并将cfg.Config.Timeout分配给main函数中的指定值。但我忽略了在main()之前隐式调用包的init()函数,因此变量延迟始终为零


顺便说一句,我不明白为什么有些人对这个问题持否定态度。我认为其他人可能会遇到类似的问题,这篇文章应该对那些不知道init()和main()之间调用顺序的受害者有所帮助。

我猜你正在同时更新
cfg.Config.Timeout
。也许是这样的:

func main() {
    StartCleanTask()
    cfg.Config.Timeout = 300
    ...
}
这引入了一种竞争,在
startcleanstask
内部的goroutine中,
delay
超时
初始化之前分配,而
fmt.Println
在初始化之后分配

您可以使用来查看这是否是问题所在


假设
cfg
只初始化一次,可能正确的修复方法是在初始化完成后才启动清理任务。

cfg.Config.Timeout的类型是什么?是time.Duration吗?它的工作原理很简单:@PawełAdamski是的,它的类型是time.Druation:Timeout-time.Duration,您是否同时更新cfg.Config.Timeout到这个值?@PaulHankin否,cfg.Config.Timeout在从配置文件(json格式)读取值时只更新一次。您是对的。实际上,在cfg包的init函数中调用了startcleanstask(),并将cfg.Config.Timeout分配给main函数中的指定值。但我忽略了在main()之前调用包的init()函数。真的谢谢!
func main() {
    StartCleanTask()
    cfg.Config.Timeout = 300
    ...
}