Golang的Int旗帜和时间。后

时间:2018-03-23 02:17:58

标签: go time flags

尝试运行与此类似的内容时,我遇到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值,则代码可以正常运行。

我在这里缺少什么?

2 个答案:

答案 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