如何乘以整数持续时间?

为了testing并发的例程,我在函数中添加了一行,使得它随机返回一个时间(最多一秒)

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

但是当我编译时,我得到了这个错误

。\ crawler.go:49:无效操作:rand.Int31n(1000)* time.Millisecond(不匹配typesint32和time.Duration)

有任何想法吗? 我怎样才能延长时间?

int32time.Duration是不同的types。 您需要将int32转换为time.Sleep(time.Duration(rand.Int31n(1000)) * time.Millisecond) ,如time.Sleep(time.Duration(rand.Int31n(1000)) * time.Millisecond)

你必须把它转换成正确格式的游乐场

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

如果您要检查文件的睡眠 ,您会发现它需要func Sleep(d Duration)持续时间作为参数。 你的rand.Int31n返回int32

从示例中的行( time.Sleep(100 * time.Millisecond) ),因为编译器足够聪明,可以理解,在这里你的常量 100意味着一个持续时间。 但是如果你传递一个variables,你应该投它。

就像这样

 time.Sleep(1000 * time.Millisecond) 

你不需要转换它。


推理:

1000是一个具有默认types整数的无types文字常量,它具有理想的types

1000 * time.Millisecond可以直接使用,因为Go自动将无types常量转换为数字types。 在这里,它会自动将1000转换为time.Duration ,因为它是Int64的别名。

毫秒定义如下:

 type Duration int64 const ( Nanosecond Duration = 1 Microsecond = 1000 * Nanosecond Millisecond = 1000 * Microsecond Second = 1000 * Millisecond Minute = 60 * Second Hour = 60 * Minute ) 

Millisecondtime.Durationtypes,但是,在底层,它是一个int64 ,它是可分配的,可以被一个数字的非types化整数使用


👉我在这里写了关于这些细节的文章 。

去默认类型Cheatsheet

在Go中,可以乘以相同types的variables,因此您需要将expression式的两个部分设置为相同的types。

你可以做的最简单的事情是在乘法之前将一个整数转换成持续时间,但这会违反单位语义。 按单位来计算期限与期限的乘积是多less?

我宁愿将time.Millisecond转换为int64,然后将其乘以毫秒数,然后将其转换为time.Duration:

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

这样,expression式的任何部分可以被认为根据其types具有有意义的值。 int64(time.Millisecond)部分只是一个无量纲值 – 原始值中的最小时间单位数。

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

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

乘法的左边部分是无意义的 – 一个types为“time.Duration”的值,持有与其types无关的东西:

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

这不仅仅是语义,还有与types相关的实际function。 此代码打印:

 100ns 100ms 

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

秒:= 10

fmt.Print(time.Duration(秒)* time.Second)//打印10秒