2017-03-05 62 views
1

誰能告訴我,爲什麼這個工程:睡了持續時間的分數

s := time.Hour/73.0 
fmt.Println("sleeping: ", s) 
time.Sleep(s) 

但這種失敗:

d := 73.0 
s := time.Hour/d 
fmt.Println("sleeping: ", s) 
time.Sleep(s) 

這是錯誤:

invalid operation: time.Hour/d (mismatched types time.Duration and float64) 

回答

5

這條線:

s := time.Hour/73.0 

short variable declaration,其中右側的表達式是:time.Hour/73.0time.Hour是來自time包的打印常數,其類型爲time.Duration; 73.0無類型數字常量在表達式中使用時,將盡可能採用適當的類型。由於time.Duration具有int64作爲其基礎類型,常數73.0可以轉換爲time.Duration而不會損失精度,因此會發生,並且會執行常量表達式time.Hour/time.Duration(73.0)

另一行:

d := 73.0 
s := time.Hour/d 

的第一行是一個短變量聲明,其中的d類型將從右側的表達,這是一個無類型數值常量(具有floating point literal給定的被推斷準確地說)。由於需要類型,因此將使用其默認類型,即float64。所以d將是一個float64類型的變量。

下一行短變量聲明:time.Hour/d,這裏time.Hour又是time.Duration類型的值,而是試圖通過float64類型的值來劃分它,未在圍棋不允許的。

要使其工作,你必須明確地轉換dtime.Duration

s := time.Hour/time.Duration(d) 

或者d必須time.Duration類型:

d := time.Duration(73.0) 
s := time.Hour/d 

或者:

var d time.Duration = 73.0 
s := time.Hour/d 

這些如果價值不可能,將無法工作用time.Duration表示,例如73.5(因爲time.Duration具有int64基礎類型)。在這種情況下,您必須將time.Hour轉換爲float64,執行除法並將結果轉換爲time.Duration,例如,:

d := 73.5 
s := time.Duration(float64(time.Hour)/d) 

閱讀的話題更多的細節:

The Go Blog: Constants

Why does 0.1 + 0.2 get 0.3 in Google Go?

How does Go perform arithmetic on constants?

Golang converting float64 to int error

+0

非常感謝詳細的答案和進一步閱讀的鏈接。我從中學到了很多! – rumdrums