rum*_*ums 1 time types const type-conversion go
有人能告诉我为什么这样有效:
s := time.Hour/73.0
fmt.Println("sleeping: ", s)
time.Sleep(s)
Run Code Online (Sandbox Code Playgroud)
但这失败了:
d := 73.0
s := time.Hour/d
fmt.Println("sleeping: ", s)
time.Sleep(s)
Run Code Online (Sandbox Code Playgroud)
这是错误:
invalid operation: time.Hour / d (mismatched types time.Duration and float64)
Run Code Online (Sandbox Code Playgroud)
这一行:
s := time.Hour/73.0
Run Code Online (Sandbox Code Playgroud)
是一个简短的变量声明,右边的表达式是:time.Hour / 73.0.time.Hour是time包中的类型常量,其类型是time.Duration; 并且73.0是一个非类型化的数字常量,当在表达式中使用时,如果可能,将采用适当的类型.由于time.Duration具有int64作为其基础类型,因此73.0可以将常量转换为time.Duration不会丢失精度,这样就会发生,并且time.Hour / time.Duration(73.0)将执行常量表达式.
另一行:
d := 73.0
s := time.Hour/d
Run Code Online (Sandbox Code Playgroud)
第一行是一个短变量声明,其中的类型d将从右侧表达式推断出来,这是一个无类型的数字常量(准确地给出一个浮点字面值).由于需要一个类型,因此将使用其默认类型float64.所以d将是一个类型的变量float64.
下一行中的短变量声明:time.Hour / d,这里time.Hour又是一个类型的值time.Duration,但是你试图将它除以一个类型的值float64,这在Go中是不允许的.
要使其工作,您必须显式转换d为time.Duration:
s := time.Hour / time.Duration(d)
Run Code Online (Sandbox Code Playgroud)
或者d必须是类型time.Duration:
d := time.Duration(73.0)
s := time.Hour / d
Run Code Online (Sandbox Code Playgroud)
要么:
var d time.Duration = 73.0
s := time.Hour / d
Run Code Online (Sandbox Code Playgroud)
如果值无法用time.Duration例如73.5(因为time.Duration具有int64基础类型)表示,则这些将不起作用.在这种情况下,您必须转换time.Hour为float64,执行除法并将结果转换为time.Duration,例如:
d := 73.5
s := time.Duration(float64(time.Hour) / d)
Run Code Online (Sandbox Code Playgroud)
阅读有关该主题的更多详情: