在错误消息中包含数据的惯用方法是什么?

时间:2017-07-29 06:26:00

标签: string go error-handling

我遇到过将变量合并到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))
}

1 个答案:

答案 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()是最快的,使用最少的内存,并且与最少的分配相关联。它也不值得(在我看来)额外的可读性成本。