В приведенном ниже примере, если 1000 - оба int (что, по моему мнению, они), почему нижняя часть не скомпилируется?
//works
time.Sleep(1000 * time.Millisecond)
//fails
var i = 1000
time.Sleep(i * time.Millisecond)
В приведенном ниже примере, если 1000 - оба int (что, по моему мнению, они), почему нижняя часть не скомпилируется?
//works
time.Sleep(1000 * time.Millisecond)
//fails
var i = 1000
time.Sleep(i * time.Millisecond)
Операторы объединяют операнды в выражения.
Сравнения обсуждаются в другом месте. Для других двоичных операторов типы операндов должны быть идентичны, если операция не включает сдвиги или нетипизированные константы. Только для операций с константами см. раздел о постоянных выражениях.
За исключением операций сдвига, если один операнд является нетипизированной константой и другой операнд не является, константа преобразуется в тип другой операнд.
Например, используя оператор "*
" (умножение),
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)
}
Go не будет автоматически конвертировать числовые типы для вас. Насколько я понимаю, 1000 не является числовым типом, пока он не будет определен как один.
В спецификации языка указано:
Конверсии требуются, когда разные выражения используются для выражения или назначения. Например, int32 и int не являются одним и тем же типом, хотя они могут иметь одинаковый размер для конкретной архитектуры.
Оба операнта должны быть одного типа time.Duration. Вы можете использовать time.Sleep(v * time.Millisecond).