按时间段的分数睡觉

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)

icz*_*cza 5

这一行:

s := time.Hour/73.0
Run Code Online (Sandbox Code Playgroud)

是一个简短的变量声明,右边的表达式是:time.Hour / 73.0.time.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
Run Code Online (Sandbox Code Playgroud)

第一行是一个短变量声明,其中的类型d将从右侧表达式推断出来,这是一个无类型的数字常量(准确地给出一个浮点字面值).由于需要一个类型,因此将使用其默认类型float64.所以d将是一个类型的变量float64.

下一行中的短变量声明:time.Hour / d,这里time.Hour又是一个类型的值time.Duration,但是你试图将它除以一个类型的值float64,这在Go中是不允许的.

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

d := 73.5
s := time.Duration(float64(time.Hour) / d)
Run Code Online (Sandbox Code Playgroud)

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

规格:常数

Go Blog:常数

为什么0.1 + 0.2在Google Go中获得0.3?

Go如何对常量执行算术运算?

Golang将float64转换为int错误