Go strings.Builder 字符串拼接操作優化
最開始的時候,可能會使用如下的操作:
package main
func main() {
ss := []string{
"sh",
"hn",
"test",
}
var str string
for _, s := range ss {
str += s
}
print(str)
}
與許多支持string類型的語言一樣,golang中的string類型也是只讀且不可變的。因此,這種拼接字符串的方式會導致大量的string創建、銷毀和內存分配。如果你拼接的字符串比較多的話,這顯然不是一個好的方法。
- 在 Golang 1.10 以前,可以使用
bytes.Buffer來優化:
package main
import (
"bytes"
"fmt"
)
func main() {
ss := []string{
"sh",
"hn",
"test",
}
var b bytes.Buffer
for _, s := range ss {
fmt.Fprint(&b, s)
}
print(b.String())
}
這里使用 var b bytes.Buffer 存放最終拼接好的字符串,一定程度上避免上面 str 每進行一次拼接操作就重新申請新的內存空間存放中間字符串的問題。
但這里依然有一個小問題: b.String() 會有一次 []byte -> string 類型轉換。而這個操作是會進行一次內存分配和內容拷貝的。
- 如果現在已經在使用 golang 1.10, 那么你還有一個更好的選擇:
strings.Builder:
package main
import (
"fmt"
"strings"
)
func main() {
ss := []string{
"sh",
"hn",
"test",
}
var b strings.Builder
for _, s := range ss {
fmt.Fprint(&b, s)
}
print(b.String())
}
參考:https://liudanking.com/performance/golang-strings-builder-原理解析/
