为什么需要将变量转换为持续时间而不是原始整数? [复制]

分享于2023年03月08日 go 问答
【问题标题】:Why do you need to convert a variable to duration but not a raw integer? [duplicate]为什么需要将变量转换为持续时间而不是原始整数? [复制]
【发布时间】:2023-03-04 23:10:01
【问题描述】:

如果我想睡 2 秒,我可以执行以下操作:

time.Sleep(2 * time.Second)

但是当我这样做时:

test := 2
time.Sleep(test * time.Second)

它会抛出错误

无效操作:test * time.Second(不匹配的类型 int 和 时间.持续时间)

我可以通过转换 test 来解决这个问题: time.Sleep(time.Duration(rand.Intn(5)) * time.Second) 但我想知道为什么当它是一个变量而不是原始值时我需要将它包装在 time.Duration 中?


【解决方案1】:

不同之处在于,在 2 * time.Second 的第一种情况下传递 const ,在声明 test := 2 的第二种情况下传递 var 。阅读 this blog post about constants in Go 了解更多详情。

基本上,代码中的 const 文字将被转换为对周围表达式有意义的类型。在第一种情况下 2 * time.Duration 这意味着 2 被转换为 time.Duration ,而在第二种情况下 test := 2 2 被分配给 test 变量。这意味着类型推断发生在那个时候,给 test 类型 int ,这是文字 2 的默认类型。如果您改用文字 2.0 ,则 test 变量将改用 float64 类型。但是,表达式 test * time.Second 已经设置了 test 的类型,它与 time.Duration 的类型不同,这就是您收到编译器错误的原因。

【讨论】:

  • "a const literal":准确地说:一个无类型的 const 文字。