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

Jef*_*son 4 go

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

x := 180
time.Sleep(15 / x * 60 * time.Second)
Run Code Online (Sandbox Code Playgroud)

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

Adr*_*ian 14

在Go中,数字文字(例如60)是无类型常量.这意味着它将被默默地强制为适合于使用它的操作的任何类型.所以当你说:

var x := 5 * time.Second
Run Code Online (Sandbox Code Playgroud)

然后将类型推断time.Second为a time.Duration,因此文字5也被视为a time.Duration.如果没有什么可以推断类型,它将采用一种类型("bool,rune,int,float64,complex128或string")并使用它.所以:

x := 180
Run Code Online (Sandbox Code Playgroud)

产量x的类型int.

但是,当你做一些操作涉及与一类的东西-喜欢,说一个变量x是一个int-那么你有两种类型,一个必须被转换为操作是合法的.

因此,对于最初的问题"什么时候int * time.Second工作,什么时候不在golang?",int * time.Second实际上从来没有在Go中工作.但是5 * time.Second不一样int * time.Second.

Go之旅中可以看到这一点:

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