为了测试并发的gorout例程,我在函数中添加了一行,使其返回的时间随机(最多一秒)
time.Sleep(rand.Int31n(1000) * time.Millisecond)
然而,当我编译时,我得到了这个错误
\履带。go:49:无效操作:rand.Int31n(1000) *时间。毫秒(类型int32和time.Duration不匹配)
什么好主意吗?如何乘以持续时间?
为了测试并发的gorout例程,我在函数中添加了一行,使其返回的时间随机(最多一秒)
time.Sleep(rand.Int31n(1000) * time.Millisecond)
然而,当我编译时,我得到了这个错误
\履带。go:49:无效操作:rand.Int31n(1000) *时间。毫秒(类型int32和time.Duration不匹配)
什么好主意吗?如何乘以持续时间?
当前回答
Int32和时间。持续时间是不同的类型。您需要将int32转换为时间。持续时间:
time.Sleep(time.Duration(rand.Int31n(1000)) * time.Millisecond)
其他回答
您必须将其转换为正确的格式。
yourTime := rand.Int31n(1000)
time.Sleep(time.Duration(yourTime) * time.Millisecond)
如果您将检查sleep的文档,您将看到它需要func sleep (d Duration) Duration作为参数。你的兰德。Int31n返回int32。
示例中的行工作(时间。Sleep(100 * time.Millisecond)),因为编译器足够聪明,可以理解这里常量100表示持续时间。但如果你传递一个变量,你应该强制转换它。
Int32和时间。持续时间是不同的类型。您需要将int32转换为时间。持续时间:
time.Sleep(time.Duration(rand.Int31n(1000)) * time.Millisecond)
你可以使用time.ParseDuration。
ms := rand.Int31n(1000)
duration, err := time.ParseDuration(fmt.Sprintf(
"%vms",
ms,
))
Go有一个Duration类型,这很好——显式定义的单位可以防止现实世界的问题。
由于Go的严格类型规则,您不能将Duration与整数相乘——必须使用强制转换才能将公共类型相乘。
/*
MultiplyDuration Hide semantically invalid duration math behind a function
*/
func MultiplyDuration(factor int64, d time.Duration) time.Duration {
return time.Duration(factor) * d // method 1 -- multiply in 'Duration'
// return time.Duration(factor * int64(d)) // method 2 -- multiply in 'int64'
}
官方文档演示了使用方法#1:
要将一个整数单位转换为持续时间,请乘以:
seconds := 10
fmt.Print(time.Duration(seconds)*time.Second) // prints 10s
但是,当然,一个持续时间乘以另一个持续时间不应该得到一个持续时间,从表面上看,这是荒谬的。举个例子,5毫秒乘以5毫秒产生6h56m40。试图平方5秒会导致溢出(如果使用常量,甚至不会编译)。
顺便说一下,以纳秒为单位的Duration的int64表示形式“将最大可表示的持续时间限制在大约290年”,这表明Duration与int64一样,被视为有符号值:(1<<(64-1))/(1e9*60*60*24*365.25) ~= 292,这正是它的实现方式:
// A Duration represents the elapsed time between two instants
// as an int64 nanosecond count. The representation limits the
// largest representable duration to approximately 290 years.
type Duration int64
因此,因为我们知道Duration的底层表示是一个int64,所以在int64和Duration之间执行强制转换是一个合理的no - op——只需要满足关于混合类型的语言规则,它对后续的乘法操作没有影响。
如果出于纯粹的原因不喜欢这种类型转换,就像我上面所示的那样,将它隐藏在一个函数调用中。
轮到我:
https://play.golang.org/p/RifHKsX7Puh
package main
import (
"fmt"
"time"
)
func main() {
var n int = 77
v := time.Duration( 1.15 * float64(n) ) * time.Second
fmt.Printf("%v %T", v, v)
}
记住一个简单的事实是有帮助的,那就是时间。Duration仅为int64,其中包含纳秒值。
这样,时间转换。持续时间成了一种形式。只需记住:
int64 总是nanosecs