2013-10-12 63 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

錯誤消息:'無效操作:我* time.Millisecond(不匹配的類型int和time.Duration)'。 – Kavu

+0

@Kavu呵呵......它令我驚訝以前的作品,然後 –

回答

15

Operators

運營商合併成操作數的表達式。

比較在其他地方討論。對於其他二元運算符,除非操作涉及移位 或無類型常量,否則 操作數類型必須相同。對於僅涉及常量的操作,請參閱關於常量表達式的 部分。

除了移位操作,如果一個操作數是一個無類型常量,而另一個操作數不是,則該常量將轉換爲其他操作數的類型 。

例如,使用 「*」(乘法)運算符,

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不是一個數字類型,直到定義爲一個。

的語言規範說:當不同的數值類型中的表達或分配混合

轉換是必需的。例如,即使int32和int在特定體系結構上可能具有相同的大小,它們的類型也不盡相同。

+1

'1000'是一個無類型的數字常量。 [常量](http://golang.org/ref/spec#Constants) – peterSO

0

兩個operants需要是相同類型的time.Duration。你可以使用time.Sleep(v * time.Millisecond)。