有人可以告诉我为什么会这样:
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)
答案 0 :(得分:5)
这一行:
s := time.Hour/73.0
是short variable declaration,右侧表达式为:time.Hour / 73.0
。 time.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
阅读有关该主题的更多详情:
Why does 0.1 + 0.2 get 0.3 in Google Go?