惯用Golang - 可读性与运行时记忆保存

时间:2017-10-26 02:53:37

标签: go idiomatic

考虑到两个选项(我看到它们,请随时赐教),例如,在检查两个字符串的相等性时,我想知道它是首选/惯用于Go:

将两个字符串分配给内存中的变量,例如:

var thing01 := strings.ToLower(strings.Replace(line, "\"", "", -1 ))[:lenEval]
var thing02 := strings.Join(p.FieldsOrder[:p.CheckNHeaders], string(p.Delimiter))

if thing01 == thing02 {
    // do stuff...
}

OR

if strings.ToLower(strings.Replace(line, "\"", "", -1 ))[:lenEval] == strings.Join(p.FieldsOrder[:p.CheckNHeaders], string(p.Delimiter)) {
    // do stuff...
}

请不要花时间考虑thing01thing02取得的成就,只要说出它们是否相同,我就可以解决它。

问题是,哪个更受欢迎?分配到内存中(仅略微授予)提高了可读性,或者只是为了实现它。并在运行时直接检查if语句?

如果我忽略了第三种选择,我也很想知道这一点。谢谢大家!

阅读所有精彩反馈后进行修改:

有几个有启发性的回应,我感谢所有花时间考虑我的问题的人。经验教训:

  • 仅仅因为一个人没有分配给一个变量,所以不能保存它 去堆栈(duh)。
  • 始终考虑可读性和可维护性,对于其他贡献者,甚至是您未来的自我!
  • 使用好的变量名称
  • 如果没有GC的高级知识,编译器等有利于一件事情更快就会咆哮错误的树。

我的修订方法:

lineFrontSplit := strings.ToLower(strings.Replace(line, `"`, "", -1 ))[:lenLineEval]
colsFrontSplit := strings.Join(p.FieldsOrder[:p.CheckNHeaders], string(p.Delimiter))
if lineFrontSplit == colsFrontSplit {
    return result, nil
}

对于我对这个道歉感到恼火的人,只是一个寻找社区洞察力的新手。如果我违反了帖子指南,请告诉我。

再次感谢所有人。

2 个答案:

答案 0 :(得分:3)

在您的情况下,第二个版本的可读性要低得多。如果你给变量一个合理的名称(不是thing),你的意图就会变得清晰。

我甚至不会考虑“分配给内存”的任何可能的开销,正如你所说的那样,因为首先你不知道编译器是否优化了它,更重要的是,即使它没有,这不是瓶颈你的程序,而不是视频编辑工具的内部循环,而不是你的服务器负责处理每秒十亿个请求的部分,或任何其他速度真正重要的例子。

总是更喜欢可读性而不是您认为可能会更慢。

如果您的程序速度或内存使用率确实存在问题,那么您可以考虑改进它(对于实际而非“内联”变量),但在这种情况下,您首先必须实际描述您的瓶颈所在是

所有这一切,你甚至可以进一步提高你的程序的可读性。根据实际情况,您可以考虑为strings.Replace(line, "\"", "", -1 )提供自己的变量或p.FieldsOrder[:p.CheckNHeaders]部分。乍看之下,这些并不清楚。它们可能不适合您的计划的其他读者,例如你自己六个月了。

另一点:你的程序说var thing01 := ...语法不正确。您可以说thing01 := ...var thing01 = ...。查看=:=之间的区别。

答案 1 :(得分:-1)

已编辑:嗯,惯用Go很多次与常识并无太大差异。我同意可读性 - 这是一个重要因素,因为维护可能是潜在的噩梦。如果你的表达变得复杂有时,通过将表达式逐步分解为易于理解的子表达式来构建表达式也是可取的。

但是,如果表达式易于理解并且预期仍然存在,那么可能需要坚持比较表达式。