在下面的例子中,如果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)
運營商合併成操作數的表達式。
比較在其他地方討論。對於其他二元運算符,除非操作涉及移位 或無類型常量,否則 操作數類型必須相同。對於僅涉及常量的操作,請參閱關於常量表達式的 部分。
除了移位操作,如果一個操作數是一個無類型常量,而另一個操作數不是,則該常量將轉換爲其他操作數的類型 。
例如,使用 「*
」(乘法)運算符,
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不是一個數字類型,直到定義爲一個。
的語言規範說:當不同的數值類型中的表達或分配混合
轉換是必需的。例如,即使int32和int在特定體系結構上可能具有相同的大小,它們的類型也不盡相同。
'1000'是一個無類型的數字常量。 [常量](http://golang.org/ref/spec#Constants) – peterSO
兩個operants需要是相同類型的time.Duration。你可以使用time.Sleep(v * time.Millisecond)。
向我們顯示錯誤消息。 –
錯誤消息:'無效操作:我* time.Millisecond(不匹配的類型int和time.Duration)'。 – Kavu
@Kavu呵呵......它令我驚訝以前的作品,然後 –