Go语言 将strings.Builder与fmt.Sprintf结合使用的替代方法

33qvvth1  于 2022-12-25  发布在  Go
关注(0)|答案(1)|浏览(171)

我正在学习Go语言中的strings包,并尝试构建一个简单的错误消息。
我读到strings.Builder是一种非常有效的连接字符串的方法,并且fmt.Sprintf允许我做一些字符串插值。
话虽如此,我还是想知道将许多字符串连接在一起的最佳方法。例如,下面是我创建的字符串:

func generateValidationErrorMessage(err error) string {
    errors := []string{}

    for _, err := range err.(validator.ValidationErrors) {
        var b strings.Builder
        b.WriteString(fmt.Sprintf("[%s] failed validation [%s]", err.Field(), err.ActualTag()))
        if err.Param() != "" {
            b.WriteString(fmt.Sprintf("[%s]", err.Param()))
        }
        errors = append(errors, b.String())
    }

    return strings.Join(errors, "; ")
}

有没有其他/更好的方法来做到这一点?使用s1 + s2是否被认为更糟糕?

svmlkihl

svmlkihl1#

您可以使用fmt直接打印到strings.Builder。请使用fmt.Fprintf(&builder, "format string", args)
Fprint...开头的fmt函数,意思是“文件打印”,允许您打印到io.Writer,如os.Filestrings.Builder
另外,不要使用多个构建器,然后在最后连接它们的字符串,而只使用一个构建器,然后不断地向它写入。如果你想添加一个分隔符,你可以在循环中很容易地完成:

var builder strings.Builder
for i, v := range values {
    if i > 0 {
        // unless this is the first item, add the separator before it.
        fmt.Fprint(&builder, "; ")
    }
    fmt.Fprintf(&builder, "some format %v", v)
}

var output = builder.String()

相关问题