time.Millisecond * int混乱

时间:2013-10-12 18:55:08

标签: go

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

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

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

5 个答案:

答案 0 :(得分:19)

  

Operators

     

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

     

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

     

除了移位操作,如果一个操作数是一个无类型的常量和   另一个操作数不是,常量被转换为类型   其他操作数。

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

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)
}

答案 1 :(得分:4)

您应该转换为time.Duration(下面是int64

var i = 1000
time.Sleep(time.Duration(i) * time.Millisecond)

答案 2 :(得分:1)

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

语言规范说:

  

在表达式或赋值中混合使用不同的数字类型时,需要进行转换。例如,int32和int的类型不同,即使它们在特定体系结构上的大小可能相同。

答案 3 :(得分:0)

两个操作符需要具有相同类型的时间。持续时间。你可以使用time.Sleep(v * time.Millisecond)。

答案 4 :(得分:0)

如果您主要对命名值感兴趣,可以将lst=[1,2,3,4,5] while(lst[len(lst)//2] != 1): #while the middle value is not 1 lst.insert(0,lst[-1]) #add the last value to the front lst = lst[:-1] # remove the last value from the end 设为常量而不是变量:

i

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