为了测试并发的gorout例程,我在函数中添加了一行,使其返回的时间随机(最多一秒)

time.Sleep(rand.Int31n(1000) * time.Millisecond)

然而,当我编译时,我得到了这个错误

\履带。go:49:无效操作:rand.Int31n(1000) *时间。毫秒(类型int32和time.Duration不匹配)

什么好主意吗?如何乘以持续时间?


当前回答

在Go中,你可以将相同类型的变量相乘,所以你需要让表达式的两个部分具有相同的类型。

您可以做的最简单的事情是在相乘之前将一个整数转换为duration,但这将违反单元语义。持续时间乘以持续时间的单位是多少?

我宁愿转换时间。毫秒转换为int64,然后将其乘以毫秒数,然后转换为time。持续时间:

time.Duration(int64(time.Millisecond) * int64(rand.Int31n(1000)))

这样,表达式的任何部分根据其类型都可以说具有有意义的值。int64(time. millisecond)部分只是一个无量纲值——原始值中最小时间单位的数量。

如果走一条稍微简单的路:

time.Duration(rand.Int31n(1000)) * time.Millisecond

乘法运算的左边部分是无意义的——一个“time”类型的值。Duration”,持有与其类型无关的东西:

numberOfMilliseconds := 100
// just can't come up with a name for following:
someLHS := time.Duration(numberOfMilliseconds)
fmt.Println(someLHS)
fmt.Println(someLHS*time.Millisecond)

这不仅仅是语义,还有与类型相关的实际功能。 这段代码输出:

100ns
100ms

有趣的是,这里的代码示例使用了最简单的代码,具有相同的Duration转换语义:https://golang.org/pkg/time/#Duration

秒数:= 10 fmt.Print(time.Duration(seconds)*time.Second) //打印10秒

其他回答

Int32和时间。持续时间是不同的类型。您需要将int32转换为时间。持续时间:

time.Sleep(time.Duration(rand.Int31n(1000)) * time.Millisecond)

在Go中,你可以将相同类型的变量相乘,所以你需要让表达式的两个部分具有相同的类型。

您可以做的最简单的事情是在相乘之前将一个整数转换为duration,但这将违反单元语义。持续时间乘以持续时间的单位是多少?

我宁愿转换时间。毫秒转换为int64,然后将其乘以毫秒数,然后转换为time。持续时间:

time.Duration(int64(time.Millisecond) * int64(rand.Int31n(1000)))

这样,表达式的任何部分根据其类型都可以说具有有意义的值。int64(time. millisecond)部分只是一个无量纲值——原始值中最小时间单位的数量。

如果走一条稍微简单的路:

time.Duration(rand.Int31n(1000)) * time.Millisecond

乘法运算的左边部分是无意义的——一个“time”类型的值。Duration”,持有与其类型无关的东西:

numberOfMilliseconds := 100
// just can't come up with a name for following:
someLHS := time.Duration(numberOfMilliseconds)
fmt.Println(someLHS)
fmt.Println(someLHS*time.Millisecond)

这不仅仅是语义,还有与类型相关的实际功能。 这段代码输出:

100ns
100ms

有趣的是,这里的代码示例使用了最简单的代码,具有相同的Duration转换语义:https://golang.org/pkg/time/#Duration

秒数:= 10 fmt.Print(time.Duration(seconds)*time.Second) //打印10秒

变量乘以时间。第二次使用以下代码

    oneHr:=3600
    addOneHrDuration :=time.Duration(oneHr)
    addOneHrCurrTime := time.Now().Add(addOneHrDuration*time.Second)

您必须将其转换为正确的格式。

yourTime := rand.Int31n(1000)
time.Sleep(time.Duration(yourTime) * time.Millisecond)

如果您将检查sleep的文档,您将看到它需要func sleep (d Duration) Duration作为参数。你的兰德。Int31n返回int32。

示例中的行工作(时间。Sleep(100 * time.Millisecond)),因为编译器足够聪明,可以理解这里常量100表示持续时间。但如果你传递一个变量,你应该强制转换它。

被一些关于Duration与Duration相乘的评论和讨论所迷惑,我玩了一些单位和函数,得到了这个:

time.Second =  1s
time.Minute =  1m0s

time.Duration(1) = 1ns
time.Duration(1) * time.Millisecond =  1ms
time.Duration(1) * time.Second =  1s
time.Duration(1) * time.Minute =  1m0s