【问题标题】:Sleeping by Fractions of a Time Duration睡眠时间的分数
【发布时间】:2017-07-25 03:06:49
【问题描述】:

谁能告诉我为什么会这样:

s := time.Hour/73.0
fmt.Println("sleeping: ", s)
time.Sleep(s)

但这失败了:

d := 73.0
s := time.Hour/d
fmt.Println("sleeping: ", s)
time.Sleep(s)

这是错误:

invalid operation: time.Hour / d (mismatched types time.Duration and float64)

【问题讨论】:

    标签: go time types type-conversion constants


    【解决方案1】:

    这一行:

    s := time.Hour/73.0
    

    short variable declaration,其中右侧表达式为:time.Hour / 73.0time.Hour 是来自time 包的类型化常量,它的类型是time.Duration;而73.0 是一个无类型数字常量,当在表达式中使用时,它会尽可能采用适当的类型。由于time.Durationint64 作为其底层类型,所以常量73.0 可以在不损失精度的情况下转换为time.Duration,这样就会发生,常量表达式time.Hour / time.Duration(73.0) 将被执行。

    另一行:

    d := 73.0
    s := time.Hour/d
    

    第一行是一个简短的变量声明,其中d 的类型将从右侧的表达式中推断出来,这是一个无类型的数字常量(准确地说是floating point literal)。由于需要类型,因此将使用其默认类型,即float64。所以d 将是float64 类型的变量。

    下一行的短变量声明:time.Hour / d,这里time.Hour 又是一个time.Duration 类型的值,但你试图将它除以float64 类型的值,这是不允许的去吧。

    要使其工作,您必须将d 显式转换为time.Duration

    s := time.Hour / time.Duration(d)
    

    或者d必须是time.Duration类型:

    d := time.Duration(73.0)
    s := time.Hour / d
    

    或者:

    var d time.Duration = 73.0
    s := time.Hour / d
    

    如果值不能用time.Duration 表示,这些将不起作用,例如73.5(因为time.Duration 具有int64 基础类型)。在这种情况下,您必须将time.Hour 转换为float64,执行除法并将结果转换为time.Duration,例如:

    d := 73.5
    s := time.Duration(float64(time.Hour) / d)
    

    阅读有关该主题的更多详细信息:

    Spec: Constants

    The Go Blog: Constants

    Why does 0.1 + 0.2 get 0.3 in Google Go?

    How does Go perform arithmetic on constants?

    Golang converting float64 to int error

    【讨论】:

    • 非常感谢您提供详细的答案和进一步阅读的链接。我从中学到了很多!
    猜你喜欢
    • 2014-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-24
    相关资源
    最近更新 更多