如何在Golang中实现随机休眠

33

我正在尝试实现随机时间睡眠(在Golang中)

r := rand.Intn(10)
time.Sleep(100 * time.Millisecond)  //working 
time.Sleep(r * time.Microsecond)    // Not working (mismatched types int and time.Duration)

如何将持续时间乘以整数? - Brent Bradburn
2个回答

58

将参数类型与 time.Sleep 相匹配:

r := rand.Intn(10)
time.Sleep(time.Duration(r) * time.Microsecond)

这是因为 time.Duration 的底层类型是 int64

type Duration int64

文档:https://golang.org/pkg/time/#Duration


int64 还是 uint64? - Dmytro Bogatov
time.Sleep((rand.Int63n(10)) * time.Second) 我尝试传入 int64,但仍然不起作用。@DmytroBogatov 可能是正确的。 - Prateek Bhuwania
@PrateekBhuwania 尝试使用 time.Sleep(time.Duration(rand.Int63n(10))*time.Second)。Go 语言没有自动类型转换。至于我的答案,它仍然是正确的:https://golang.org/pkg/time/#Duration - abhink
@abhink 是的,你的解决方案是正确的。我只是想知道 time.Second 是否为 int64,而 rand.Int63n() 也返回 int64,那么为什么在乘法过程中会出现类型不匹配的问题呢? - Prateek Bhuwania

8
如果您尝试多次运行相同的rand.Intn函数,您将在输出中看到相同的数字。
就像官方文档https://golang.org/pkg/math/rand/中所写的那样,
顶层函数(例如Float64和Int)使用默认共享Source,在每次运行程序时生成确定性序列的值。 如果需要每次运行不同的行为,则使用Seed函数初始化默认Source。
它应该看起来更像这样。
rand.Seed(time.Now().UnixNano())
r := rand.Intn(100)
time.Sleep(time.Duration(r) * time.Millisecond)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接