Время .Millisecond * int путаница

В приведенном ниже примере, если 1000 - оба int (что, по моему мнению, они), почему нижняя часть не скомпилируется?

//works
time.Sleep(1000 * time.Millisecond)

//fails
var i = 1000
time.Sleep(i * time.Millisecond)

Ответ 1

Operators

Операторы объединяют операнды в выражения.

Сравнения обсуждаются в другом месте. Для других двоичных операторов типы операндов должны быть идентичны, если операция не включает сдвиги или нетипизированные константы. Только для операций с константами см. раздел о постоянных выражениях.

За исключением операций сдвига, если один операнд является нетипизированной константой и другой операнд не является, константа преобразуется в тип другой операнд.

Например, используя оператор "*" (умножение),

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)
}

Ответ 2

Go не будет автоматически конвертировать числовые типы для вас. Насколько я понимаю, 1000 не является числовым типом, пока он не будет определен как один.

В спецификации языка указано:

Конверсии требуются, когда разные выражения используются для выражения или назначения. Например, int32 и int не являются одним и тем же типом, хотя они могут иметь одинаковый размер для конкретной архитектуры.

Ответ 3

Оба операнта должны быть одного типа time.Duration. Вы можете использовать time.Sleep(v * time.Millisecond).