前言
因为之前是搞java的在使用字符串拼接的时候避免一直+
产生新的String对象,就使用StringBuilder或者StringBuffer。最近在使用go的时候也需要字符串拼接,所以查了下go的字符串拼接的方式,发现有很多种,下面我们将从使用->直观的性能比较->背后的原因来娓娓道来。
使用
fmt.Sprintf
func useFmtSprintf(s1 string, s2 string) {
fmt.Println(fmt.Sprintf("%s-%s", s1, s2))
}
+
func useAdd(s1 string, s2 string) {
fmt.Println(s1 + s2)
}
strings.Join
func useStringJoin(s1 string, s2 string) {
fmt.Println(strings.Join([]string{s1, s2}, ""))
}
bytes.Buffer
func useBuffer(s1 string, s2 string) {
buffer := bytes.Buffer{}
buffer.WriteString(s1)
buffer.WriteString(s2)
fmt.Println(buffer.String())
}
strings.Builder
func useStringBuilder(s1 string, s2 string) {
builder := strings.Builder{}
builder.WriteString(s1)
builder.WriteString(s2)
fmt.Println(builder.String())
}
性能对比
package test
import (
"bytes"
"fmt"
"strings"
"testing"
)
// fmt.Printf
func BenchmarkFmtSprintfMore(b *testing.B) {
var s string
for i := 0; i < b.N; i++ {
s += fmt.Sprintf("%s%s", "hello", "world")
}
fmt.Errorf(s)
}
// 加号 拼接
func BenchmarkAddMore(b *testing.B) {
var s string
for i := 0; i < b.N; i++ {
s += "hello" + "world"
}
fmt.Errorf(s)
}
// strings.Join
func BenchmarkStringsJoinMore(b *testing.B) {
var s string
for i := 0; i < b.N; i++ {