time.Millisecond * int 混淆

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


//works

time.Sleep(1000 * time.Millisecond)


//fails

var i = 1000

time.Sleep(i * time.Millisecond)


HUX布斯
浏览 268回答 3
3回答

慕少森

运营商运算符将操作数组合成表达式。比较在别处讨论。对于其他二元运算符,除非操作涉及移位或无类型常量,否则操作数类型必须相同。对于仅涉及常量的操作,请参阅常量表达式部分。除移位操作外,如果一个操作数是无类型常量而另一个操作数不是,则将常量转换为另一个操作数的类型。例如,使用“ *”(乘法)运算符,package mainimport (    "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)}

HUWWW

Go 不会为您自动转换数字类型。据我了解,1000 在定义为 1 之前不是数字类型。语言规范说:当不同的数字类型混合在一个表达式或赋值中时,需要进行转换。例如,int32 和 int 不是同一种类型,即使它们在特定架构上可能具有相同的大小。
打开App,查看更多内容
随时随地看视频慕课网APP