以下の例では、1000が両方ともint型の場合(なぜそうだと思いますか)、なぜ底部がコンパイルに失敗するのでしょうか?time.Millisecond * int confusion
//works
time.Sleep(1000 * time.Millisecond)
//fails
var i = 1000
time.Sleep(i * time.Millisecond)
以下の例では、1000が両方ともint型の場合(なぜそうだと思いますか)、なぜ底部がコンパイルに失敗するのでしょうか?time.Millisecond * int confusion
//works
time.Sleep(1000 * time.Millisecond)
//fails
var i = 1000
time.Sleep(i * time.Millisecond)
演算子は、式にオペランドを組み合わせます。
比較は他の箇所で説明します。他の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)
}
Goは自動的に数値タイプを変換しません。私が理解する限り、1000は1に定義されるまで数値型ではありません。
言語仕様は言う:異なる数値型は、式や代入で混在している場合
の変換が必要とされています。例えば、int32とintは、特定のアーキテクチャー上で同じサイズを持っていても同じ型ではありません。
'1000'は型なしの数値定数です。 [定数](http://golang.org/ref/spec#Constants) – peterSO
両方operantsは、同じタイプのtime.Durationであることが必要です。あなたはtime.Sleep(v * time.Millisecond)を使うことができます。
エラーメッセージを表示してください。 –
エラーメッセージ: '無効な操作:i * time.Millisecond(型不一致intとtime.Duration)'。 – Kavu
@Kavu huh ...それは私に前作を驚かせ、 –