2013-10-12 17 views
11

Nell'esempio seguente, se i 1000 sono entrambi int (cosa che penso che siano), perché il fondo non riesce a compilare?time.Millisecond * int confusione

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

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

Mostraci il messaggio di errore. –

+0

Messaggio di errore: 'operazione non valida: i * time.Millisecond (tipi non corrispondenti int e time.Duration)'. – Kavu

+0

@Kavu huh ... mi sorprende il precedente, quindi –

risposta

15

Operators

Operatori combinano operandi in espressioni.

I confronti sono discussi altrove. Per gli altri operatori binari, i tipi di operandi devono essere identici a meno che l'operazione non contenga le costanti o non tipizzate. Per le operazioni che coinvolgono solo le costanti, vedere la sezione sulle espressioni costanti.

Tranne per le operazioni di spostamento, se un operando è una costante non tipizzata e l'altro operando non lo è, la costante viene convertita nel tipo dell'operando .

Ad esempio, utilizzando l'operatore "*" (moltiplicazione),

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 non converte automaticamente i tipi numerici per voi. Per quanto ho capito, 1000 non è un tipo numerico finché non viene definito come uno.

La specifica del linguaggio dice:

conversioni sono necessari quando diversi tipi numerici sono mescolati in un'espressione o di assegnazione. Ad esempio, int32 e int non sono dello stesso tipo anche se possono avere la stessa dimensione su una particolare architettura.

+1

'1000' è una costante numerica non tipizzata. [Costanti] (http://golang.org/ref/spec#Constants) – peterSO

0

Entrambi gli operanti devono essere dello stesso tipo time.Duration. È possibile utilizzare time.Sleep (v * time.Millisecond).