为什么需要将变量转换为持续时间而不是原始整数?

Abe*_*ler 4 go

如果我想睡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它是一个变量时包装它而不是它是一个原始值?

gon*_*utz 5

不同的是,你传递一个const在第一种情况下2 * time.Secondvar在声明的第二个案例test := 2.阅读关于Go中常量的博客文章了解更多详情.

基本上,代码中的const文字将转换为对周围表达有意义的类型.在第一种情况下,2 * time.Duration这意味着在第二种情况下将其2转换为time.Durationwhile,并将test := 22分配给test变量.这意味着,类型推理发生在这一点上,给人test的类型int这是字面的默认类型2.如果您使用了文字2.0,则test变量将具有类型float64.但是,表达式test * time.Second具有test已设置的类型,time.Duration并且与您获得编译器错误的类型不同.