最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

GoLang中拼接字符串性能優(yōu)化方法詳解

 更新時(shí)間:2023年02月03日 09:38:15   作者:raoxiaoya  
最近在做性能優(yōu)化,有個(gè)函數(shù)里面的耗時(shí)特別長,看里面的操作大多是一些字符串拼接的操作,而字符串拼接在 golang 里面其實(shí)有很多種實(shí)現(xiàn),下面這篇文章主要給大家介紹了關(guān)于Golang語言如何高效拼接字符串的相關(guān)資料,需要的朋友可以參考下

字符串在內(nèi)存中是不可變的,放在只讀內(nèi)存段,因此你可以使用str[0]來訪問,但是不能使用str[0]='a'來修改。

修改字符串實(shí)際上是重新放入新的地址,因此拼接字符串可能出現(xià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)存的頻繁分配。

再來看看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對象,它包含一個(gè)切片。

type Builder struct {
	addr *Builder // of receiver, to detect copies by value
	buf  []byte
}

BuilderGrow方法就是主動(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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解Go語言中結(jié)構(gòu)體與JSON間的轉(zhuǎn)換

    詳解Go語言中結(jié)構(gòu)體與JSON間的轉(zhuǎn)換

    這篇文章主要為大家詳細(xì)介紹了Go語言中結(jié)構(gòu)體與JSON間的轉(zhuǎn)換,文中的示例代碼講解詳細(xì),對學(xué)習(xí)Go語言有一定的幫助,需要的可以參考一下
    2022-12-12
  • Golang 內(nèi)存管理簡單技巧詳解

    Golang 內(nèi)存管理簡單技巧詳解

    這篇文章主要為大家介紹了Golang 內(nèi)存管理簡單技巧詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • 讓goland支持proto文件類型的實(shí)現(xiàn)

    讓goland支持proto文件類型的實(shí)現(xiàn)

    這篇文章主要介紹了讓goland支持proto文件類型的實(shí)現(xiàn)操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • 獲取Golang環(huán)境變量的三種方式小結(jié)

    獲取Golang環(huán)境變量的三種方式小結(jié)

    本文介紹了Golang中獲取環(huán)境變量的三種方式,包含使用Viper包、GoDotEnv包和os包,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-11-11
  • Go語言reflect.TypeOf()和reflect.Type通過反射獲取類型信息

    Go語言reflect.TypeOf()和reflect.Type通過反射獲取類型信息

    這篇文章主要介紹了Go語言reflect.TypeOf()和reflect.Type通過反射獲取類型信息,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • go mock server的簡易實(shí)現(xiàn)示例

    go mock server的簡易實(shí)現(xiàn)示例

    這篇文章主要為大家介紹了go mock server的簡易實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • Go 語言數(shù)組和切片的區(qū)別詳解

    Go 語言數(shù)組和切片的區(qū)別詳解

    本文主要介紹了Go 語言數(shù)組和切片的區(qū)別詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • Go中sync.Once源碼的深度講解

    Go中sync.Once源碼的深度講解

    sync.Once是Go語言標(biāo)準(zhǔn)庫中的一個(gè)同步原語,用于確保某個(gè)操作只執(zhí)行一次,本文將從源碼出發(fā)為大家詳細(xì)介紹一下sync.Once的具體使用,x希望對大家有所幫助
    2025-01-01
  • Go語言中l(wèi)og日志庫的介紹

    Go語言中l(wèi)og日志庫的介紹

    本文給大家介紹Go語言中l(wèi)og日志庫的概念使用技巧,log包定義了Logger類型,該類型提供了一些格式化輸出的方法,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2021-10-10
  • 淺談Golang如何使用Viper進(jìn)行配置管理

    淺談Golang如何使用Viper進(jìn)行配置管理

    在Golang生態(tài)中,Viper是一個(gè)不錯(cuò)的開源配置管理框架,這篇文章主要為大家介紹了Golang如何使用Viper進(jìn)行配置管理,需要的可以參考一下
    2023-06-06

最新評論

玉田县| 长顺县| 乐都县| 乌鲁木齐县| 麻江县| 金坛市| 康定县| 乐山市| 乐东| 乳源| 海门市| 策勒县| 江西省| 镇赉县| 宣化县| 和龙市| 运城市| 五指山市| 周口市| 三门峡市| 湖南省| 通辽市| 六枝特区| 峡江县| 安平县| 汶上县| 宜兴市| 靖西县| 福海县| 菏泽市| 双流县| 常宁市| 西盟| 舒兰市| 宁强县| 太仓市| 陆丰市| 桐庐县| 菏泽市| 泰州市| 威海市|