2012-12-19 92 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)应该工作,与第一个是理论上略微大于第二快。