2017-07-29 58 views
0

我遇到过不同的方法将变量合并到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)) 
} 

回答

3

除非你有很少的记忆,或将要产生大量的这些错误,我不会担心它。就惯用Go而言,我会选择h()选项,因为它更易于阅读。

这里的好处是,使用分配,内存和速度可以用一些简单的基准`去测试-bench的

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() 
    } 
} 

输出进行测试。 -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()是最快的,使用最少的内存,并且是并列分配最少。这也是不值得的(在我看来)额外的可读性成本。

相关问题