【问题标题】:time.Millisecond * int confusiontime.Millisecond * int 混淆
【发布时间】:2013-10-20 16:52:58
【问题描述】:

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

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

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

【问题讨论】:

  • 显示错误信息。
  • 错误信息:invalid operation: i * time.Millisecond (mismatched types int and time.Duration).
  • @Kavu 呵呵...以前的作品让我吃惊,然后
  • @nemo:有什么关系?

标签: go


【解决方案1】:

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

package main

import (
    "time"
)

func main() {
    // works:
    time.Sleep(1000 * time.Millisecond)

    // works also:
    const i = 1000
    time.Sleep(i * time.Millisecond)
}

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

【讨论】:

    【解决方案2】:

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

    语言规范说:

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

    【讨论】:

    • 1000 是一个无类型的数字常量。 Constants
    【解决方案3】:

    你应该转换成time.Duration(下面是int64

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

    【讨论】:

      【解决方案4】:

      两个操作符必须是相同类型的时间。持续时间。您可以使用 time.Sleep(v * time.Millisecond)。

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-06-18
          • 2013-05-26
          • 1970-01-01
          • 2020-04-05
          • 1970-01-01
          • 2014-07-09
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多