GoLang中拼接字符串性能優(yōu)化方法詳解
字符串在內(nèi)存中是不可變的,放在只讀內(nèi)存段,因此你可以使用str[0]來(lái)訪(fǎng)問(wèn),但是不能使用str[0]='a'來(lái)修改。
修改字符串實(shí)際上是重新放入新的地址,因此拼接字符串可能出現(xiàn)的性能問(wèn)題就是頻繁的內(nèi)存分配,比如:
func s1(ids []string) (s string) {
for _, id := range ids {
s += id
}
return
}
在golang中,具有預(yù)先分配內(nèi)存特性的是切片,如果預(yù)先就分配好內(nèi)存,然后再依次將字符串裝進(jìn)去就避免了內(nèi)存的頻繁分配。
再來(lái)看看strings包的實(shí)現(xiàn)
func Join(elems []string, sep string) string {
switch len(elems) {
case 0:
return ""
case 1:
return elems[0]
}
n := len(sep) * (len(elems) - 1)
for i := 0; i < len(elems); i++ {
n += len(elems[i])
}
var b Builder
b.Grow(n)
b.WriteString(elems[0])
for _, s := range elems[1:] {
b.WriteString(sep)
b.WriteString(s)
}
return b.String()
}
主要就用到strings.Builder對(duì)象,它包含一個(gè)切片。
type Builder struct {
addr *Builder // of receiver, to detect copies by value
buf []byte
}
Builder的Grow方法就是主動(dòng)擴(kuò)容切片的容積。
// grow copies the buffer to a new, larger buffer so that there are at least n
// bytes of capacity beyond len(b.buf).
func (b *Builder) grow(n int) {
buf := make([]byte, len(b.buf), 2*cap(b.buf)+n)
copy(buf, b.buf)
b.buf = buf
}
// Grow grows b's capacity, if necessary, to guarantee space for
// another n bytes. After Grow(n), at least n bytes can be written to b
// without another allocation. If n is negative, Grow panics.
func (b *Builder) Grow(n int) {
b.copyCheck()
if n < 0 {
panic("strings.Builder.Grow: negative count")
}
if cap(b.buf)-len(b.buf) < n {
b.grow(n)
}
}
到此這篇關(guān)于GoLang中拼接字符串性能優(yōu)化方法詳解的文章就介紹到這了,更多相關(guān)GoLang拼接字符串內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解Go語(yǔ)言中結(jié)構(gòu)體與JSON間的轉(zhuǎn)換
這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言中結(jié)構(gòu)體與JSON間的轉(zhuǎn)換,文中的示例代碼講解詳細(xì),對(duì)學(xué)習(xí)Go語(yǔ)言有一定的幫助,需要的可以參考一下2022-12-12
讓goland支持proto文件類(lèi)型的實(shí)現(xiàn)
這篇文章主要介紹了讓goland支持proto文件類(lèi)型的實(shí)現(xiàn)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12
獲取Golang環(huán)境變量的三種方式小結(jié)
本文介紹了Golang中獲取環(huán)境變量的三種方式,包含使用Viper包、GoDotEnv包和os包,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-11-11
Go語(yǔ)言reflect.TypeOf()和reflect.Type通過(guò)反射獲取類(lèi)型信息
這篇文章主要介紹了Go語(yǔ)言reflect.TypeOf()和reflect.Type通過(guò)反射獲取類(lèi)型信息,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04
go mock server的簡(jiǎn)易實(shí)現(xiàn)示例
這篇文章主要為大家介紹了go mock server的簡(jiǎn)易實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07

