28

在下面的示例中,如果 1000 都是 int 的(我认为它们是),为什么底部无法编译?

//works
time.Sleep(1000 * time.Millisecond)

//fails
var i = 1000
time.Sleep(i * time.Millisecond)
4

5 回答 5

25

运营商

运算符将操作数组合成表达式。

比较在别处讨论。对于其他二元运算符,操作数类型必须相同,除非该操作涉及移位或无类型常量。对于仅涉及常量的操作,请参见常量表达式部分。

除移位操作外,如果一个操作数是无类型常量而另一个操作数不是,则该常量将转换为另一个操作数的类型。

例如,使用“ *”(乘法)运算符,

package main

import (
    "time"
)

func main() {

    // works - 1000 is an untyped constant
    // which is converted to type time.Duration
    time.Sleep(1000 * time.Millisecond)

    // fails - v is a variable of type int
    // which is not identical to type time.Duration
    var v = 1000
    // invalid operation: i * time.Millisecond (mismatched types int and time.Duration)
    time.Sleep(v * time.Millisecond)
}
于 2013-10-12T19:12:04.277 回答
16

你应该转换为time.Duration(下面是一个int64

var i = 1000
time.Sleep(time.Duration(i) * time.Millisecond)
于 2018-06-10T04:27:06.440 回答
1

i如果您主要对命名值感兴趣,则可以创建常量而不是变量:

package main

import (
    "time"
)

func main() {
    // works:
    time.Sleep(1000 * time.Millisecond)

    // works also:
    const i = 1000
    time.Sleep(i * time.Millisecond)
}

回复:https ://stackoverflow.com/a/19338130/11630268

于 2020-07-07T09:23:54.537 回答
0

Go 不会自动为您转换数字类型。据我了解, 1000 在定义为 1 之前不是数字类型。

语言规范说:

当表达式或赋值中混合了不同的数值类型时,需要进行转换。例如,int32 和 int 不是同一类型,即使它们在特定架构上可能具有相同的大小。

于 2013-10-12T19:02:54.447 回答
-2

两个操作符必须是相同类型的 time.Duration。您可以使用 time.Sleep(v * time.Millisecond)。

于 2014-06-27T18:35:29.010 回答