在下面的示例中,如果 1000 都是 int 的(我认为它们是),为什么底部无法编译?
//works
time.Sleep(1000 * time.Millisecond)
//fails
var i = 1000
time.Sleep(i * time.Millisecond)
在下面的示例中,如果 1000 都是 int 的(我认为它们是),为什么底部无法编译?
//works
time.Sleep(1000 * time.Millisecond)
//fails
var i = 1000
time.Sleep(i * time.Millisecond)
运算符将操作数组合成表达式。
比较在别处讨论。对于其他二元运算符,操作数类型必须相同,除非该操作涉及移位或无类型常量。对于仅涉及常量的操作,请参见常量表达式部分。
除移位操作外,如果一个操作数是无类型常量而另一个操作数不是,则该常量将转换为另一个操作数的类型。
例如,使用“ *
”(乘法)运算符,
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)
}
你应该转换为time.Duration
(下面是一个int64
)
var i = 1000
time.Sleep(time.Duration(i) * time.Millisecond)
i
如果您主要对命名值感兴趣,则可以创建常量而不是变量:
package main
import (
"time"
)
func main() {
// works:
time.Sleep(1000 * time.Millisecond)
// works also:
const i = 1000
time.Sleep(i * time.Millisecond)
}
Go 不会自动为您转换数字类型。据我了解, 1000 在定义为 1 之前不是数字类型。
语言规范说:
当表达式或赋值中混合了不同的数值类型时,需要进行转换。例如,int32 和 int 不是同一类型,即使它们在特定架构上可能具有相同的大小。
两个操作符必须是相同类型的 time.Duration。您可以使用 time.Sleep(v * time.Millisecond)。