在 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/template
或 safehtml/template
。
strings.Builder
来零散地构建一个字符串 #在逐位建立字符串时,更倾向于使用strings.Builder
。strings.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]"