按时间段的分数睡觉

时间:2017-03-05 06:51:54

标签: go time types type-conversion const

有人可以告诉我为什么会这样:

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)

1 个答案:

答案 0 :(得分:5)

这一行:

s := time.Hour/73.0

short variable declaration,右侧表达式为:time.Hour / 73.0time.Hour是来自time包的类型常量,其类型为time.Duration; 73.0无类型数字常量,在表达式中使用时,如果可能,将采用适当的类型。由于time.Duration具有int64作为其基础类型,因此常量73.0可以转换为time.Duration而不会丢失精度,因此会发生这种情况,并且常量表达式{{1将被执行。

另一行:

time.Hour / time.Duration(73.0)

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

下一行中的短变量声明:float64,此处time.Hour / d又是time.Hour类型的值,但您尝试将其除以类型{{1}的值在Go中不允许这样做。

要使其有效,您必须明确地将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

阅读有关该主题的更多详情:

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