在下面的例子中,如果1000都是int(我认为它们是),为什么底部无法编译?
//works
time.Sleep(1000 * time.Millisecond)
//fails
var i = 1000
time.Sleep(i * time.Millisecond)
答案 0 :(得分:19)
运算符将操作数组合成表达式。
比较在别处讨论。对于其他二元运算符, 除非操作涉及轮班,否则操作数类型必须相同 或无类型的常量。对于仅涉及常量的操作,请参阅 常量表达式部分。
除了移位操作,如果一个操作数是一个无类型的常量和 另一个操作数不是,常量被转换为类型 其他操作数。
例如,使用“*
”(乘法)运算符
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