惯用的Golang-可读性与运行时内存节约

惯用的Golang-可读性与运行时内存节约,go,idioms,Go,Idioms,考虑到这两个选项(如我所见,请随意告诉我),例如,在检查两个字符串的相等性时,我想知道它在Go to中是否是首选/惯用的: 将两个字符串分配给内存中的变量,例如: var thing01 := strings.ToLower(strings.Replace(line, "\"", "", -1 ))[:lenEval] var thing02 := strings.Join(p.FieldsOrder[:p.CheckNHeaders], string(p.Delimiter)) if thi

考虑到这两个选项(如我所见,请随意告诉我),例如,在检查两个字符串的相等性时,我想知道它在Go to中是否是首选/惯用的:

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

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...
}

请不要花时间思考
thing01
thing02
完成了什么,我只想说一下它们是否是相等的字符串

问题是,哪个更可取?分配到内存时,可读性得到了提高(只是稍微提高了一点),还是在运行时直接在
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
}
对于我为此道歉而恼火的人,我只是一个从社区中寻找见解的新手。如果我违反了post准则,请让我知道


再次感谢大家。

编辑:好吧,惯用围棋在很多时候与常识没有太大区别。我同意可读性-这是一个重要的因素,因为维护可能是一个潜在的噩梦,特别是如果您的表达式变得复杂。有时,通过将表达式一步一步地分解为易于理解的子表达式来构建表达式也是可取的


但是,如果表达式很容易理解,并且预期会保持这种状态,那么您可能希望坚持比较表达式

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

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

总是喜欢可读性,而不是你认为可能较慢的内容

<>如果你确实对程序的速度或内存使用有问题,那么你可以考虑改进它(真实的而不是“内联”变量),但是在这种情况下,你首先必须对瓶颈所在的地方进行剖析。 综上所述,您甚至可以进一步提高程序的可读性。根据实际情况,您可以考虑给出<代码>字符串。替换(行,“\”,“,”,1)< /代码>它自己的变量或<代码> P.FieldSord[[ P.ChankHealths] ] /代码>部分。这些对我来说是一目了然的。它们可能不适合您的程序的其他读者,例如六个月内的你自己。


另一点:你的程序说:“代码> var thg01:=……/代码>这是语法不正确的。你可以说<代码> thig01:=…<代码> > Valth-thn01=…。请参阅<代码> = 和<代码>:= ./P>前者:程序是由程序员读取的。也考虑使用后退引用(“原始”)。字符串文本,否则它们应该包含反斜杠。很抱歉,我可能忽略了一点,因为它们之间的区别在于是否只将一些临时表达式赋给变量。如果您希望,某些内容不会存储到内存中,只是因为它没有名称,这是错误的。请选择更好的可读方式,不要再考虑w这是惯用语。你做的每件事都不必有惯用语。你的例子可能会削弱1970年左右机器的ram。这是堆栈上的两个字符串,我不担心。可读性和简单性应该是你的目标。我想我会采用第一种可读性方法,除非我有证据表明这一特定的code是导致内存问题/GC开销的原因。无论是否将结果分配给命名变量,结果都必须在内存中。除此之外的任何细节(它停留的时间,是否保存在寄存器/堆栈/堆中,等等)受操作系统、体系结构和Go版本之间不同的编译器优化的影响,除非性能关键型代码和评测显示有可测量的改进,否则您不应尝试控制这些优化。接受这一点,因为它为我认为的团队共识以及直观的正如你所说,请相信我,从现在起六个月后,我会关注自己或其他贡献者。@lofcek也有很好的区别。我将使用提供的建议进行重构。

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