gpt4 book ai didi

go - 按持续时间的分数 sleep

转载 作者:IT王子 更新时间:2023-10-29 01:52:24 28 4
gpt4 key购买 nike

谁能告诉我为什么会这样:

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

short variable declaration ,其中右侧表达式为:time.Hour / 73.0 . time.Hour是来自 time 的类型常量包,它的类型是 time.Duration ;和 73.0是一个无类型数字常量,当它在表达式中使用时,将尽可能采用适当的类型。自 time.Durationint64作为其基础类型,常量 73.0可以转换为time.Duration没有精度损失,所以会发生,常量表达式 time.Hour / time.Duration(73.0)将被执行。

另一行:

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

第一行是简短的变量声明,其中d的类型将从右侧表达式推断出,这是一个无类型的数字常量(准确地说是 floating point literal)。由于需要一个类型,因此将使用其默认类型,即 float64 .所以d将是 float64 类型的变量.

下一行的简短变量声明:time.Hour / d , 在这里 time.Hour又是 time.Duration 类型的值, 但您尝试将其除以 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.Durationint64 底层类型)。在这种情况下,您必须转换 time.Hourfloat64 , 执行除法并将结果转换为 time.Duration ,例如:

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

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

Spec: Constants

The Go Blog: Constants

Why does 0.1 + 0.2 get 0.3 in Google Go?

How does Go perform arithmetic on constants?

Golang converting float64 to int error

关于go - 按持续时间的分数 sleep ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42605412/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com