2013-10-12 5 views
11

Im folgenden Beispiel, wenn die 1000 sind beide int (was ich denke, dass sie sind) warum würde die Unterseite nicht kompilieren?time.Millisecond * Int Verwirrung

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

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

Zeigen Sie uns die Fehlermeldung. –

+0

Fehlermeldung: ungültige Operation: i * time.Millisecond (nicht übereinstimmende Typen int und time.Duration) '. – Kavu

+0

@Kavu huh ... es überrascht mich das ehemalige funktioniert, dann –

Antwort

15

Operators

Operatoren kombinieren Operanden in Ausdrücken.

Vergleiche werden an anderer Stelle diskutiert. Für andere binäre Operatoren müssen die Operandentypen identisch sein, es sei denn, die Operation beinhaltet Verschiebungen oder untypisierte Konstanten. Informationen zu Operationen, die nur Konstanten enthalten, finden Sie im Abschnitt über konstante Ausdrücke.

Außer bei Shift-Operationen, wenn ein Operand eine untypisierte Konstante und der andere Operand nicht ist, wird die Konstante in den Typ des anderen Operanden konvertiert.

Zum Beispiel mit dem "*" (Multiplikation) 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) 
} 
1

Go nicht numerischen Typen automatisch für Sie konvertieren. Soweit ich weiß, ist 1000 kein numerischer Typ, bis er als einer definiert ist.

Die die Sprachspezifikation sagt:

Konvertierungen erforderlich sind, wenn verschiedene numerische Typen in einem Ausdruck oder Zuordnung gemischt werden. Zum Beispiel sind int32 und int nicht vom selben Typ, obwohl sie in einer bestimmten Architektur dieselbe Größe haben können.

+1

'1000' ist eine nicht typisierte numerische Konstante. [Konstanten] (http://golang.org/ref/spec#Constants) – peterSO

0

Beiden operants müssen vom gleichen Typ time.Duration sein. Sie können time.Sleep (v * time.Millisecond) verwenden.