Go strings.Builder


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-原理解析/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM