我遇到过将变量合并到Go中的错误消息的不同方法。在下面的例子中,哪种方式是惯用的?还有更好的选择吗?
当事情开始破裂时哪个更安全?例如,当剩余的内存很少时,优先选择分配较少字节的选项。
哪个更快,以防我们需要产生大量错误?
可以在Go Play Space或官方Go Playground中查看完整的可运行代码。
func f() error {
return SepError("Sepuled " + strconv.Itoa(n) + " sepulcas " + strconv.Itoa(t) +
" times each")
}
func g() error {
return SepError(strings.Join([]string{
"Sepuled", strconv.Itoa(n), "sepulcas", strconv.Itoa(t), "times each"}, " "))
}
func h() error {
return SepError(fmt.Sprintf("Sepuled %d sepulcas %d times each", n, t))
}
答案 0 :(得分:3)
除非你的内存很少,或者会产生大量的这些错误,否则我不会担心。至于惯用Go,我会选择h()
选项,因为它更容易阅读。
这里的好处是可以使用一些简单的基准测试分配,使用的内存和速度
func BenchmarkF(b *testing.B) {
for i := 0; i <= b.N; i++ {
f()
}
}
func BenchmarkG(b *testing.B) {
for i := 0; i <= b.N; i++ {
g()
}
}
func BenchmarkH(b *testing.B) {
for i := 0; i <= b.N; i++ {
h()
}
}
输出`go test -bench。 -benchmem
BenchmarkF-8 10000000 169 ns/op 72 B/op 4 allocs/op
BenchmarkG-8 10000000 204 ns/op 120 B/op 5 allocs/op
BenchmarkH-8 5000000 237 ns/op 80 B/op 4 allocs/op
正如您所看到的,f()
是最快的,使用最少的内存,并且与最少的分配相关联。它也不值得(在我看来)额外的可读性成本。