使用字符串的替代方案.Builder与fmt.Sprintf结合使用



我正在学习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被认为更糟吗?

您可以使用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()

最新更新