惯用的 Golang - 可读性与运行时内存保护
Idiomatic Golang - Readability vs. Runtime Memory Conservation
鉴于这两个选项(如我所见,请不吝赐教),例如,在检查两个字符串是否相等时,我想知道它是否是preferred/idiomatic in 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
完成的事情,如果它们是相等的字符串我想解决就够了。
问题是,哪个是首选?分配到内存中(仅略微授予)提高了可读性,或者只是 'go for it' 并在 运行 时间直接检查 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 准则,请告诉我。
再次感谢大家。
编辑: 嗯,地道的 Go 很多时候与常识并没有太大的不同。我同意可读性——这是一个重要因素,因为维护可能是一个潜在的噩梦,尤其是。如果你的表达变得复杂。有时,通过将表达式逐步分解为易于理解的子表达式来构建表达式也是可取的。
但是,如果表达式易于理解并且希望保持这种状态,则可能需要坚持比较表达式。
在你的情况下,第二个版本的可读性要差得多。如果你给你的变量起一个合理的名字(不是 thing
),你的意图就会变得清晰。
我什至不会考虑 "assigning to memory" 的任何可能的开销,正如您所说,因为首先您不知道编译器是否优化了它,更重要的是,即使它没有优化,这也不是你的程序的瓶颈,不是视频编辑工具的紧密内部循环,不是你的服务器负责每秒处理十亿个请求的部分,也不是速度真正重要的任何其他例子。
总是更喜欢可读性而不是你认为的可能会更慢。
如果你真的遇到程序速度或内存使用方面的问题,那么你可以考虑改进它(真正的而不是通过 "inlining" 变量),但在那种情况下你首先必须实际剖析你的瓶颈所在。
综上所述,您甚至可以进一步提高程序的可读性。根据实际情况,您可以考虑给 strings.Replace(line, "\"", "", -1 )
自己的变量或 p.FieldsOrder[:p.CheckNHeaders]
部分。这些我乍一看不是很清楚。它们可能不适合您程序的其他读者,例如六个月后你自己。
还有一点:你的程序说 var thing01 := ...
这在语法上是不正确的。您可以说 thing01 := ...
或 var thing01 = ...
。查看 =
和 :=
之间的区别。
鉴于这两个选项(如我所见,请不吝赐教),例如,在检查两个字符串是否相等时,我想知道它是否是preferred/idiomatic in 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
完成的事情,如果它们是相等的字符串我想解决就够了。
问题是,哪个是首选?分配到内存中(仅略微授予)提高了可读性,或者只是 'go for it' 并在 运行 时间直接检查 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 准则,请告诉我。
再次感谢大家。
编辑: 嗯,地道的 Go 很多时候与常识并没有太大的不同。我同意可读性——这是一个重要因素,因为维护可能是一个潜在的噩梦,尤其是。如果你的表达变得复杂。有时,通过将表达式逐步分解为易于理解的子表达式来构建表达式也是可取的。
但是,如果表达式易于理解并且希望保持这种状态,则可能需要坚持比较表达式。
在你的情况下,第二个版本的可读性要差得多。如果你给你的变量起一个合理的名字(不是 thing
),你的意图就会变得清晰。
我什至不会考虑 "assigning to memory" 的任何可能的开销,正如您所说,因为首先您不知道编译器是否优化了它,更重要的是,即使它没有优化,这也不是你的程序的瓶颈,不是视频编辑工具的紧密内部循环,不是你的服务器负责每秒处理十亿个请求的部分,也不是速度真正重要的任何其他例子。
总是更喜欢可读性而不是你认为的可能会更慢。
如果你真的遇到程序速度或内存使用方面的问题,那么你可以考虑改进它(真正的而不是通过 "inlining" 变量),但在那种情况下你首先必须实际剖析你的瓶颈所在。
综上所述,您甚至可以进一步提高程序的可读性。根据实际情况,您可以考虑给 strings.Replace(line, "\"", "", -1 )
自己的变量或 p.FieldsOrder[:p.CheckNHeaders]
部分。这些我乍一看不是很清楚。它们可能不适合您程序的其他读者,例如六个月后你自己。
还有一点:你的程序说 var thing01 := ...
这在语法上是不正确的。您可以说 thing01 := ...
或 var thing01 = ...
。查看 =
和 :=
之间的区别。