2012-12-19 128 views
9

我在我目前的Go代碼一些地方看起來像這樣:避免過多的轉換

i := int(math.Floor(float64(len(l)/4))) 

冗長,似乎因爲一些功能型的簽名像在math.Floor必要的,但它可以被簡化?

回答

13

一般來說,Go的嚴格類型會導致一些冗長的表達式。詳盡並不意味着口吃。類型轉換可以做有用的事情,並且明確說明這些有用的東西是很有價值的。

簡化的訣竅是不寫不需要的類型轉換,因此您需要參考文檔(如語言定義)。

在您的具體情況下,您需要知道len()返回int,並且值>> 0.您需要知道4是一個常量,它將在此表達式中使用int類型,並且你需要知道整數除法將返回整數商數,在這種情況下,它將是一個非負整數,實際上就是你想要的答案。

i := len(l)/4 

這種情況很簡單。

+0

是的,謝謝你的回覆。這是一個簡單的例子,但是例如像'math.Max'這樣的表達式會讓人討厭。 – GiantSquid

+0

「您需要知道4是一個常量,它將在此表達式中使用int類型。」我很好奇,你怎麼知道的,因爲常量沒有特定的類型? – kristianp

2

我不是100%確定Go如何處理整數除法和整數轉換,但它通常是通過截斷。因此,假設LEN(L)是一個int

i:=len(l)/4 

否則i:= int(len(l))/4i:=int(len(l)/4)應該工作,與第一個是理論上略微大於第二快。