如果我想睡2秒钟,我可以做以下事情:
time.Sleep(2 * time.Second)
Run Code Online (Sandbox Code Playgroud)
但是当我这样做时:
test := 2
time.Sleep(test * time.Second)
Run Code Online (Sandbox Code Playgroud)
它抛出错误
无效操作:test*time.Second(不匹配类型int和time.Duration)
我可以通过test这样的方式来解决这个问题:time.Sleep(time.Duration(rand.Intn(5)) * time.Second)但是我想知道为什么我需要在time.Duration它是一个变量时包装它而不是它是一个原始值?
不同的是,你传递一个const在第一种情况下2 * time.Second和var在声明的第二个案例test := 2.阅读关于Go中常量的博客文章了解更多详情.
基本上,代码中的const文字将转换为对周围表达有意义的类型.在第一种情况下,2 * time.Duration这意味着在第二种情况下将其2转换为time.Durationwhile,并将test := 2其2分配给test变量.这意味着,类型推理发生在这一点上,给人test的类型int这是字面的默认类型2.如果您使用了文字2.0,则test变量将具有类型float64.但是,表达式test * time.Second具有test已设置的类型,time.Duration并且与您获得编译器错误的类型不同.
| 归档时间: |
|
| 查看次数: |
66 次 |
| 最近记录: |