例如,在检查两个字符串的相等性时,有两个选项(如我所见,请赐教),我想知道在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...
}
要么
if strings.ToLower(strings.Replace(line, "\"", "", -1 ))[:lenEval] == strings.Join(p.FieldsOrder[:p.CheckNHeaders], string(p.Delimiter)) {
// do stuff...
}
请不要花时间思考
thing01
和thing02
完成什么,只要说出它们是否相等,就可以解决。问题是,哪个是首选?分配给内存时(只有一点点同意)提高了可读性,或者只是“去做”并在运行时直接在
if
语句中检查?如果我忽略了第三种选择,我也很想知道。谢谢大家!
阅读所有很棒的反馈后进行编辑:
有几个启发性的回答,我感谢所有花时间考虑我的问题的人。得到教训:
去堆栈(duh)。
我修改后的方法:
lineFrontSplit := strings.ToLower(strings.Replace(line, `"`, "", -1 ))[:lenLineEval]
colsFrontSplit := strings.Join(p.FieldsOrder[:p.CheckNHeaders], string(p.Delimiter))
if lineFrontSplit == colsFrontSplit {
return result, nil
}
对于我为此道歉感到烦恼的人,只是一个新手,他们正在寻找社区的真知灼见。如果我违反了发布指南,请告诉我。
再次谢谢大家。
最佳答案
在您的情况下,第二个版本的可读性要差得多。如果为变量指定一个明智的名称(而不是thing
),则您的意图会变得很清楚。
正如您所说,我什至不会考虑“分配给内存”的任何可能的开销,因为首先您不知道编译器是否对此进行了优化,更重要的是,即使没有这样做,这也不是程序的瓶颈,不是视频编辑工具的内在循环,不是服务器中负责每秒处理十亿个请求的部分,或者不是速度真正重要的任何其他示例。
始终比更喜欢可读性,而可能会更慢。
如果您确实对程序的速度或内存使用有疑问,则可以考虑对其进行改进(针对实际情况,而不是通过“内联”变量进行),但是在这种情况下,您首先必须实际分析瓶颈所在。
综上所述,您甚至可以进一步提高程序的可读性。根据实际情况,您可以考虑给strings.Replace(line, "\"", "", -1 )
它自己的变量或p.FieldsOrder[:p.CheckNHeaders]
部分。这些乍一看对我来说还不清楚。它们可能不适用于您程序的其他读者,例如在六个月内完成自己。
还有一点:您的程序说var thing01 := ...
在语法上是不正确的。您可以说thing01 := ...
或var thing01 = ...
。查看=
和:=
之间的区别。