您好,登錄后才能下訂單哦!
本篇內容主要講解“Golang中字符串拼接問題怎么解決”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Golang中字符串拼接問題怎么解決”吧!
Go的字符串是一個不可改變的數據結構,這和其他語言如JAVA,C++等的設定很類似.總體來說,有如下五種拼接方式,下面我們將論述各種方式的性能問題,以及如何選擇.
(golang字符串,內存模型)
type StringHeader struct { Data uintptr Len int }
注意:字符串具有不可改變的特性,即便通過指針等變相操作
var a string = "old" bptr := (*reflect.StringHeader)(unsafe.Pointer(&a)) dataPtr := (*byte)(unsafe.Pointer(bptr.Data)) var b = [3]byte{'n', 'e', 'w'} *dataPtr = b[0] //報錯 fmt.Println(bptr)
方式一、直接+
當使用連接符 + 拼接兩個字符串時,會生成一個新的字符串并開辟新的內存空間,空間大小等于兩個字符串之和。在訓中中時,不斷拼接新的字符串,這樣就會不斷申請內存空間, 性能就會越來越差。 所以,在字符串密集拼接場景中,使用 + 會嚴重降低性能。包括熱路徑的代碼.
方式二、strings.Builder
func Benchmark_StringsBuilder(b *testing.B) { var sb strings.Builder for i := 0; i < b.N; i++ { sb.WriteString("hello world") } _ = sb.String() }
方式三、bytes.Buffer
func Benchmark_BytesBuffer(b *testing.B) { var buf bytes.Buffer for i := 0; i < b.N; i++ { buf.WriteString("hello world") } _ = buf.String() }
方式四、fmt.Fprint(&buf,&str)
方式五、strings.Join
性能不是最優,但在切片的情況下,可以用來拼接
Benchmark_StringAdd Benchmark_StringAdd-8 117806 127059 ns/op Benchmark_BytesBuffer Benchmark_BytesBuffer-8 38938282 25.88 ns/op Benchmark_StringsBuilder Benchmark_StringsBuilder-8 57249450 18.53 ns/op
3.1 性能方面,strings.Builder 比 bytes.Buffer 快差不多 20%,
原因:strings.Builder 和 bytes.Buffer 底層都是一個 []byte,但是 bytes.Buffer 轉換字符串時會重新申請內存空間用來存放, 而 strings.Builder 直接將底層的 []byte 利用指針的方式強轉為字符串.
//strings.Builder的String() func (b *Builder) String() string { return *(*string)(unsafe.Pointer(&b.buf)) } //bytes.Builder的String() func (b *Buffer) String() string { if b == nil { // Special case, useful in debugging. return "<nil>" } return string(b.buf[b.off:]) }
3.2 strings.Builder通常性能最優,但底層依賴于[]byte,所以如果平凡擴容就不妙了,因此我們需要借助它的Grow方法,以已分配最終[]byte的容量,避免因為擴容帶來的性能損失
func Benchmark_StringConcat(b *testing.B) { str := "hello world" var sb strings.Builder sb.Grow(b.N * len(str)) for i := 0; i < b.N; i++ { sb.WriteString(str) } _ = sb.String() }
3.3 strings.Builder沒有拷貝構造(借用C++說法),因為
type Builder struct { addr *Builder // of receiver, to detect copies by value buf []byte //如果拷貝,這個buf共享,最后導致數據混亂 }
到此,相信大家對“Golang中字符串拼接問題怎么解決”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。