为什么time.Sleep(5 * time.Second)
工作正常,但是:
x := 180
time.Sleep(15 / x * 60 * time.Second)
没有?我收到类型不匹配错误(类型int64
和time.Duration
)。鉴于错误,我更了解后者失败的原因而不是前者成功的原因。
答案 0 :(得分:13)
在Go中,numeric literal (e.g. 60
) is an untyped constant。这意味着它将被默默地强制为适合于使用它的操作的任何类型。所以当你说:
var x := 5 * time.Second
然后,类型从time.Second
推断为time.Duration
,因此文字5
也被视为time.Duration
。如果没有什么可以推断类型,它将采用一种类型(“bool,rune,int,float64,complex128或string”)并使用它。所以:
x := 180
收益x
,类型为int
。
然而,当你做一些涉及某种类型的操作时 - 比如说x
变量int
- 那么你有两种类型,一种必须转换才能进行操作合法的。
因此,对于原始问题“int * time.Second
何时起作用以及何时不起作用?”,int * time.Second
实际从不在Go中起作用。但5 * time.Second
与int * time.Second
不同。
the Go tour中已触及此内容:
无类型常量采用其上下文所需的类型。