2013-10-12 6 views
11

W poniższym przykładzie, jeśli 1000-y są zarówno int (które myślę, że są), dlaczego nie uda się skompilować dna?time.Millisecond * int confusion

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

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

Wyświetlemy komunikat o błędzie. –

+0

Komunikat o błędzie: 'invalid operation: i * time.Millisecond (niedopasowane typy int i time.Duration)'. – Kavu

+0

@Kavu huh ... zaskakuje mnie poprzednie prace, następnie –

Odpowiedz

15

Operators

Operatorzy łączą argumentów do wyrażeń.

Porównania są omówione w innym miejscu. W przypadku innych operatorów binarnych typy operandów muszą być identyczne, chyba że operacja wymaga przesunięć lub stałych bez znaku. W przypadku operacji obejmujących tylko stałe, zobacz rozdział na temat wyrażeń stałych.

Z wyjątkiem operacji zmiany, jeśli jeden operand jest stałą bez typu i , drugi operand nie jest, stała jest konwertowana na typ innego operandu .

Na przykład, stosując (rozmnażanie) operatora "*"

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

Go nie będzie automatycznie konwertować typów liczbowych dla Ciebie. O ile rozumiem, 1000 nie jest typem liczbowym dopóki nie zostanie zdefiniowany jako jeden.

specyfikacji język mówi:

konwersji wymagane jest, gdy różne typy liczbowe miesza się w ekspresji lub przydziału. Na przykład int32 i int nie są tego samego typu, mimo że mogą mieć ten sam rozmiar w konkretnej architekturze.

+1

'1000' jest niezmodyfikowaną stałą numeryczną. [Constants] (http://golang.org/ref/spec#Constants) – peterSO

0

Oba operand muszą być tego samego typu time.Duration. Możesz użyć time.Sleep (v * time.Millisecond).