尝试运行与此类似的内容时,我遇到invalid operation: *timeout * time.Second (mismatched types int and time.Duration)
错误
timeout := flag.Int("timeout", 30, "The time limit for answering questions.")
flag.Parse()
timeoutCh := time.After(*timeout * time.Second)
为了确定,我使用*timeout
检查了reflect.TypeOf()
的类型,实际上是int
。但是,如果我执行timeoutCh := time.After(30 * time.Second)
或使用任何其他int
值,则代码可以正常运行。
我在这里缺少什么?
答案 0 :(得分:1)
timeoutCh := time.After(time.Duration(*timeout) * time.Second)
您必须将类型为*timeout
的{{1}}转换为time.Duration
类型。 int
有效的原因是time.After(30 * time.Second)
是无类型的,并且转换为30
的类型time.Duration
。见https://golang.org/ref/spec#Operators。类似地,此代码可以正常工作
time.Second
但是这段代码不会编译
x := uint(42)
if x == 42 {
println("works!")
}
答案 1 :(得分:1)
您不能将两种不同的类型相乘,因此您需要将整数转换为time.Duration类型。你可以这样做,只需像这样:
time.Duration(*timeout)
时间的“单位”在技术上是纳秒和时间。秒是一秒的纳秒。数学算法虽然如此,你可以简单地说出这样的话3秒钟:
time.Duration(3) * time.Second