Go 时间。毫秒*整数混乱

Go 时间。毫秒*整数混乱,go,Go,在下面的示例中,如果1000都是int(我认为是),为什么底部无法编译 //works time.Sleep(1000 * time.Millisecond) //fails var i = 1000 time.Sleep(i * time.Millisecond) Go不会为您自动转换数字类型。据我所知,1000在定义为1之前不是数字类型 语言规范说: 当表达式或赋值中混合了不同的数值类型时,需要进行转换。例如,int32和int不是相同的类型,即使它们在特定体系结构上可能具有相同的大小

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

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

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

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

语言规范说:

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

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

其他地方讨论了比较。对于其他二进制运算符 除非操作涉及移位,否则操作数类型必须相同 或非类型化常量。有关仅涉及常数的操作,请参见 关于常量表达式的部分

除移位操作外,如果一个操作数是非类型常量,则 如果另一个操作数不是,则常量将转换为 其他操作数

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

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。您可以使用time.Sleep(v*time.毫秒)。

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


如果您主要对命名值感兴趣,可以将
i
设置为常量而不是变量:

主程序包
进口(
“时间”
)
func main(){
//作品:
时间。睡眠(1000*时间。毫秒)
//工程还包括:
常数i=1000
时间。睡眠(i*时间。毫秒)
}

回复:

显示错误消息。错误消息:
无效操作:i*time.millished(int和time.Duration类型不匹配)
@Kavu-huh。。。让我惊讶的是前者的工作原理,然后是相关的:@nemo:它是如何相关的?
1000
是一个非类型的数字常量。谢谢-我被困在这上面了!
var i = 1000
time.Sleep(time.Duration(i) * time.Millisecond)