time.Millisecond * int confusion

Go won't convert numeric types automatically for you. As far as I understand, 1000 isn't a numeric type until defined as one.

The language specification says:

Conversions are required when different numeric types are mixed in an expression or assignment. For instance, int32 and int are not the same type even though they may have the same size on a particular architecture.


Operators

Operators combine operands into expressions.

Comparisons are discussed elsewhere. For other binary operators, the operand types must be identical unless the operation involves shifts or untyped constants. For operations involving constants only, see the section on constant expressions.

Except for shift operations, if one operand is an untyped constant and the other operand is not, the constant is converted to the type of the other operand.

For example, using the "*" (multiplication) operator,

package main

import (
    "time"
)

func main() {

    // works - 1000 is an untyped constant
    // which is converted to type time.Duration
    time.Sleep(1000 * time.Millisecond)

    // fails - v is a variable of type int
    // which is not identical to type time.Duration
    var v = 1000
    // invalid operation: i * time.Millisecond (mismatched types int and time.Duration)
    time.Sleep(v * time.Millisecond)
}

You can make i a constant instead of a variable, if you are primarily interested in naming the value:

package main

import (
    "time"
)

func main() {
    // works:
    time.Sleep(1000 * time.Millisecond)

    // works also:
    const i = 1000
    time.Sleep(i * time.Millisecond)
}

In-reply-to: https://stackoverflow.com/a/19338130/11630268


You should convert to time.Duration (which underneath is an int64)

var i = 1000
time.Sleep(time.Duration(i) * time.Millisecond)

Tags:

Go