如何乘以整数持续时间?
为了testing并发的例程,我在函数中添加了一行,使得它随机返回一个时间(最多一秒)
time.Sleep(rand.Int31n(1000) * time.Millisecond)
但是当我编译时,我得到了这个错误
。\ crawler.go:49:无效操作:rand.Int31n(1000)* time.Millisecond(不匹配typesint32和time.Duration)
有任何想法吗? 我怎样才能延长时间?
int32
和time.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 )
Millisecond
有time.Duration
types,但是,在底层,它是一个int64
,它是可分配的,可以被一个数字的非types化整数使用 。
👉我在这里写了关于这些细节的文章 。
在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秒