因为之前是搞java的在使用字符串拼接的时候避免一直+
产生新的String对象,就使用StringBuilder或者StringBuffer。最近在使用go的时候也需要字符串拼接,所以查了下go的字符串拼接的方式,发现有很多种,下面我们将从使用->直观的性能比较->背后的原因来娓娓道来。
- func useFmtSprintf(s1 string, s2 string) {
- fmt.Println(fmt.Sprintf("%s-%s", s1, s2))
- }
-
- func useAdd(s1 string, s2 string) {
- fmt.Println(s1 + s2)
- }
-
- func useStringJoin(s1 string, s2 string) {
- fmt.Println(strings.Join([]string{s1, s2}, ""))
- }
-
- func useBuffer(s1 string, s2 string) {
- buffer := bytes.Buffer{}
- buffer.WriteString(s1)
- buffer.WriteString(s2)
- fmt.Println(buffer.String())
- }
-
- 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++ {