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

标签 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))
}

最佳答案

除非您的内存很少,或者将产生大量此类错误,否则我不会担心。就惯用的 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/

相关文章:

去隐式转换接口(interface)做内存分配?

postgresql - 如何创建一个在列中包含 slice 的表

error-handling - Adobe Sign 访问 token invalid_request

c# - 从 TextBox 填充整数数组

c - 确定字符串是否是 C 中的有效 IPv4 地址

MySQL字符串的最后一个索引

string - 使用动态编程将字符串拆分为单词

go - 将字符串转换为float32?

javascript - 在单元测试中创建具有特定属性的错误对象

javascript - 如何轻松处理javascript异步函数中的所有错误?