字符串拼接

在 Go 中,有几种字符串拼接的方法。包括下面几种例子:

  • “+“运算符
  • fmt.Sprintf
  • strings.Builder
  • text/template
  • safehtml/template

尽管选择哪种方法没有一刀切的规则,但下面的指南概述了在什么情况下哪种方法是首选。

简单情况下,首选 “+” #

当连接几个字符串时,更愿意使用 “+"。这种方法在语法上是最简单的,不需要导入包。

// Good:
key := "projectid: " + p

格式化时首选fmt.Sprintf #

当建立一个带有格式化的复杂字符串时,倾向于使用fmt.Sprintf。使用许多 “+“运算符可能会掩盖最终的结果。

// Good:
str := fmt.Sprintf("%s [%s:%d]-> %s", src, qos, mtu, dst)
// Bad:
bad := src.String() + " [" + qos.String() + ":" + strconv.Itoa(mtu) + "]-> " + dst.String()

最佳做法:当构建字符串操作的输出是一个io.Writer时,不要用fmt.Sprintf构建一个临时字符串,只是为了把它发送给 Writer。相反,使用fmt.Fprintf来直接向 Writer 发送。

当格式化更加复杂时,请酌情选择 text/templatesafehtml/template

倾向于使用strings.Builder来零散地构建一个字符串 #

在逐位建立字符串时,更倾向于使用strings.Builderstrings.Builder需要摊销的线性时间,而 “+“和fmt.Sprintf在连续调用以形成一个较大的字符串时需要二次时间。

// Good:
b := new(strings.Builder)
for i, d := range digitsOfPi {
    fmt.Fprintf(b, "the %d digit of pi is: %d\n", i, d)
}
str := b.String()

常量字符串

在构建常量、多行字符串变量时,倾向于使用反引号(`)。

// Good:
usage := `Usage:

custom_tool [args]`
// Bad:
usage := "" +
  "Usage:\n" +
  "\n" +
  "custom_tool [args]"