2013-10-12 13 views
11

以下の例では、1000が両方ともint型の場合(なぜそうだと思いますか)、なぜ底部がコンパイルに失敗するのでしょうか?time.Millisecond * int confusion

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

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

エラーメッセージを表示してください。 –

+0

エラーメッセージ: '無効な操作:i * time.Millisecond(型不一致intとtime.Duration)'。 – Kavu

+0

@Kavu huh ...それは私に前作を驚かせ、 –

答えて

15

Operators

演算子は、式にオペランドを組み合わせます。

比較は他の箇所で説明します。他の2進演算子の場合、 のオペランド・タイプは、操作が のシフトまたは型なしの定数を含まない限り、同一でなければなりません。定数だけを含む演算については、定数式に関する のセクションを参照してください。

シフト演算を除いて、一方のオペランドが型なし定数で、他方のオペランドが ではない場合、定数は他のオペランド の型に変換されます。例えば

"*"(乗算)演算子を使用して、

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は自動的に数値タイプを変換しません。私が理解する限り、1000は1に定義されるまで数値型ではありません。

言語仕様は言う:異なる数値型は、式や代入で混在している場合

の変換が必要とされています。例えば、int32とintは、特定のアーキテクチャー上で同じサイズを持っていても同じ型ではありません。

+1

'1000'は型なしの数値定数です。 [定数](http://golang.org/ref/spec#Constants) – peterSO

0

両方operantsは、同じタイプのtime.Durationであることが必要です。あなたはtime.Sleep(v * time.Millisecond)を使うことができます。