有人可以告诉我这为什么起作用:
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)
这行:
s := time.Hour/73.0
是一个简短的变量声明,右侧表达式为:time.Hour / 73.0。time.Hour是time包中的类型常量,其类型为time.Duration;并且73.0是一种 无类型数值常量 ,其在表达时,将可能的话采取适当的类型。由于time.Duration具有int64作为其基础类型,因此73.0可以在time.Duration不损失精度的情况下将常量转换为常量,从而time.Hour / time.Duration(73.0)可以执行常量表达式。
time.Hour / 73.0
time.Hour
time
time.Duration
73.0
int64
time.Hour / time.Duration(73.0)
另一行:
d := 73.0 s := time.Hour/d
第一行是一个简短的变量声明,其中的类型d将从右边的表达式中推断出来,这是一个无类型的数字常量(确切地说是带浮点字面量)。由于需要一种类型,因此将使用其默认类型float64。因此d将是type的变量float64。
d
float64
下一行的简短变量声明:time.Hour / d,这time.Hour也是type的值time.Duration,但是您尝试将其除以type的值float64,这在Go中是不允许的。
time.Hour / d
要使其工作,您必须显式转换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,例如:
73.5
d := 73.5 s := time.Duration(float64(time.Hour) / d)
阅读有关该主题的更多详细信息:
规格:常数
围棋博客:常量