什么时候`int * time.Second`工作,什么时候不在golang?

时间:2018-03-26 18:33:03

标签: go

为什么time.Sleep(5 * time.Second)工作正常,但是:

x := 180
time.Sleep(15 / x * 60 * time.Second)

没有?我收到类型不匹配错误(类型int64time.Duration)。鉴于错误,我更了解后者失败的原因而不是前者成功的原因。

1 个答案:

答案 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.Secondint * time.Second不同。

the Go tour中已触及此内容:

  

无类型常量采用其上下文所需的类型。