【问题标题】:Avoid too much conversion避免过多的转换
【发布时间】:2012-12-19 22:52:42
【问题描述】:

我当前的 Go 代码中有一些部分如下所示:

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

由于某些函数类型签名,例如math.Floor 中的签名,冗长似乎是必要的,但可以简化吗?

【问题讨论】:

    标签: go


    【解决方案1】:

    一般来说,Go 的严格类型会导致一些冗长的表达式。冗长并不意味着口吃。类型转换做有用的事情,明确说明这些有用的事情是很有价值的。

    简化的技巧是不要编写不需要的类型转换,为此您需要参考诸如语言定义之类的文档。

    在您的具体情况下,您需要知道 len() 返回 int,并且值 >= 0。您需要知道 4 是一个常量,在此表达式中将采用 int 类型,并且您需要知道整数除法将返回整数商,在这种情况下它将是一个非负整数,实际上正是您想要的答案。

    i := len(l)/4
    

    这个案子很简单。

    【讨论】:

    • 好的,谢谢您的回复。这是一个简单的例子,但是对于math.Max 之类的表达式会很烦人。
    • "你需要知道 4 是一个常量,在这个表达式中将采用 int 类型"。我很好奇,你是怎么知道的,因为常量没有特定的类型?
    【解决方案2】:

    我不是 100% 确定 Go 如何处理整数除法和整数转换,但通常是通过截断。因此,假设 len(l) 是一个 int

    i:=len(l)/4
    

    否则i:= int(len(l))/4i:=int(len(l)/4) 应该可以工作,理论上第一个比第二个稍快。

    【讨论】:

      猜你喜欢
      • 2014-11-26
      • 1970-01-01
      • 2022-10-08
      • 1970-01-01
      • 2014-08-12
      • 1970-01-01
      • 2018-01-18
      • 2014-11-18
      相关资源
      最近更新 更多