我遇到过在 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))
}
最佳答案
除非您的内存很少,或者将产生大量此类错误,否则我不会担心。就惯用的 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()
是最快的,使用最少的内存,并且分配最少。这也不值得(在我看来)可读性的额外成本。
关于string - 在错误消息中包含数据的惯用方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45386093/