小编典典

按时间分数进行睡眠

go

有人可以告诉我这为什么起作用:

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)

阅读 299

收藏
2020-07-02

共1个答案

小编典典

这行:

s := time.Hour/73.0

是一个简短的变量声明,右侧表达式为:time.Hour / 73.0time.Hourtime包中的类型常量,其类型为time.Duration;并且73.0是一种
无类型数值常量
,其在表达时,将可能的话采取适当的类型。由于time.Duration具有int64作为其基础类型,因此73.0可以在time.Duration不损失精度的情况下将常量转换为常量,从而time.Hour / time.Duration(73.0)可以执行常量表达式。

另一行:

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

第一行是一个简短的变量声明,其中的类型d将从右边的表达式中推断出来,这是一个无类型的数字常量(确切地说是带浮点字面量)。由于需要一种类型,因此将使用其默认类型float64。因此d将是type的变量float64

下一行的简短变量声明:time.Hour / d,这time.Hour也是type的值time.Duration,但是您尝试将其除以type的值float64,这在Go中是不允许的。

要使其工作,您必须显式转换dtime.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.Hourfloat64,执行除法并将结果转换为time.Duration,例如:

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

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

规格:常数

围棋博客:常量

2020-07-02