In Go, a numeric literal (e.g. 60
) is an untyped constant. That means it will be silently coerced to whatever type is appropriate for the operation where it's being used. So when you say:
var x := 5 * time.Second
Then the type is inferred from time.Second
to be a time.Duration
, and thus the literal 5
is also treated as a time.Duration
. If there's nothing to infer a type from, it will assume a type ("bool, rune, int, float64, complex128 or string") and use that. So:
x := 180
Yields x
with a type of int
.
However, when you do some operation involving something with a type - like, say a variable x
that is an int
- then you have two types and one must be converted for the operation to be legal.
So, to the original question "When does int * time.Second
work and when does it not in golang?", int * time.Second
actually never works in Go. But 5 * time.Second
isn't the same as int * time.Second
.
This is touched on in the Go tour:
An untyped constant takes the type needed by its context.