亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Golang語(yǔ)言如何高效拼接字符串詳解

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

01、介紹

在編程語(yǔ)言中,字符串是一種重要的數(shù)據(jù)結(jié)構(gòu)。在 Golang 語(yǔ)言中,因?yàn)樽址荒鼙辉L問(wèn),不能被修改,所以,如果我們?cè)?Golang 語(yǔ)言中進(jìn)行字符串拼接操作,Golang 需要進(jìn)行內(nèi)存拷貝。

如果讀者朋友們了解過(guò) Golang 語(yǔ)言?xún)?nèi)存管理的相關(guān)知識(shí),就會(huì)知道內(nèi)存拷貝會(huì)帶來(lái)性能消耗。在 Golang 語(yǔ)言中,提供了多種字符串拼接的方式,為了降低我們編寫(xiě)的程序性能損耗,本文我們介紹一下每種字符串拼接方式的特點(diǎn),從而學(xué)會(huì)根據(jù)不同場(chǎng)景選擇性能最好的字符串拼接方式。

02、操作符 +

使用操作符 + 拼接字符串,是最簡(jiǎn)單的一種字符串拼接方式,它的特點(diǎn)是可讀性強(qiáng),但是性能一般,因?yàn)槊看纹唇?,都涉及?nèi)存拷貝,需要分配一塊新內(nèi)存,并且該方式也僅適用于字符串類(lèi)型的變量。所以,該方式適用于少量字符串類(lèi)型的變量進(jìn)行字符串拼接的場(chǎng)景。

示例代碼:

str := "a" + "b" + "c"

03、strings.Join 方法

標(biāo)準(zhǔn)庫(kù) strings 中的 Join 方法,該方式只能用于拼接字符串類(lèi)型的切片,將字符串類(lèi)型的切片中的每個(gè)元素拼接為一個(gè)字符串,適用于拼接字符串類(lèi)型切片中的元素的場(chǎng)景。

示例代碼:

s := []string{"a", "b", "c"}
str := strings.Join(s, ", ")

04、fmt.Sprint 方法

標(biāo)準(zhǔn)庫(kù) fmt 中的 Sprint,Sprintf 和 Sprintln 方法,也是比較常用的一種字符串拼接方式,它的特點(diǎn)是可以拼接其它類(lèi)型,涉及類(lèi)型轉(zhuǎn)換,底層實(shí)現(xiàn)使用 []byte 字節(jié)切片,但是性能一般,所以,該方式適用于少量包含其它非字符串類(lèi)型變量進(jìn)行字符串拼接的場(chǎng)景。

示例代碼:

str := fmt.Sprint("a", 1, "b\r\n")
str1 := fmt.Sprintf("name:%s,age=%d.\r\n", "lucy", 17)
str2 := fmt.Sprintln("a", 1, "b")

05、bytes.Buffer 類(lèi)型

標(biāo)準(zhǔn)庫(kù) bytes 中的 Buffer 類(lèi)型,該類(lèi)型中 WriteString 方法和 String 方法配合使用,也可以實(shí)現(xiàn)字符串拼接,它的特點(diǎn)是可以拼接字符串、字符和 Unicode,底層實(shí)現(xiàn)使用 []byte,但是涉及 string 和 []byte 之間的轉(zhuǎn)換,性能一般,因?yàn)?WriteString 方法使用的 buffer 太長(zhǎng),會(huì)導(dǎo)致 panic,所以,該方式適用于少量字符變量和字符串變量進(jìn)行字符串拼接的場(chǎng)景。

示例代碼:

var b bytes.Buffer
b.WriteString("My ")
b.WriteString("name ")
b.WriteString("is ")
b.WriteString("lucy.")
str := b.String()

06、strings.Builder 類(lèi)型

標(biāo)準(zhǔn)庫(kù) strings 中的 Builder 類(lèi)型,該類(lèi)型中 WriteString 方法和 String 方法配合使用,也可以實(shí)現(xiàn)字符串拼接,使用方式和 bytes.Buffer 相同,可以拼接字符串、字符和 Unicode,也會(huì)涉及 string 和 []byte 之間的轉(zhuǎn)換,但是,它使用 unsafe.Pointer 優(yōu)化了 string 和 []byte 之間的轉(zhuǎn)換,所以,在大量字符串拼接的場(chǎng)景,推薦使用該種方式。

示例代碼:

var b bytes.Builer
b.WriteString("My ")
b.WriteString("name ")
b.WriteString("is ")
b.WriteString("lucy.")
str := b.String()

07、總結(jié)

本文我們介紹了 Golang 語(yǔ)言中的 5 種字符串拼接方式,相信讀者朋友們已經(jīng)了解每種方式適合使用的場(chǎng)景。最后,我再做個(gè)簡(jiǎn)要總結(jié)。

  • 在少量?jī)H有字符串類(lèi)型的變量拼接字符串時(shí),并且對(duì)性能要求不高的場(chǎng)景,推薦使用操作符 + 的方式;
  • 在字符串類(lèi)型切片中的元素拼接字符串時(shí),推薦使用 strings.Join 方式;
  • 在少量多種類(lèi)型變量拼接字符串時(shí),推薦使用 fmt.Sprint 的方式;
  • 在少量字符串、字符和 Unicode 拼接字符串時(shí),并且對(duì)性能有一定要求的場(chǎng)景,推薦使用 buyes.Buffer 的方式;
  • 在大量字符串、字符和 Unicode 拼接字符串時(shí)。并且對(duì)性能有一定要求的場(chǎng)景,推薦使用 strings.Builder 的方式。

到此這篇關(guān)于Golang語(yǔ)言如何高效拼接字符串的文章就介紹到這了,更多相關(guān)Golang高效拼接字符串內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • go語(yǔ)言的初始化順序,包,變量,init詳解

    go語(yǔ)言的初始化順序,包,變量,init詳解

    這篇文章主要介紹了go語(yǔ)言的初始化順序,包,變量,init詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • Go 中 slice 的 In 功能實(shí)現(xiàn)探索

    Go 中 slice 的 In 功能實(shí)現(xiàn)探索

    這篇文章主要介紹了Go 中 slice 的 In 功能實(shí)現(xiàn)探索,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-09-09
  • go實(shí)現(xiàn)整型的二進(jìn)制轉(zhuǎn)化的方法

    go實(shí)現(xiàn)整型的二進(jìn)制轉(zhuǎn)化的方法

    這篇文章主要介紹了go實(shí)現(xiàn)整型的二進(jìn)制轉(zhuǎn)化的方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下
    2019-07-07
  • GO比較兩個(gè)對(duì)象是否相同實(shí)戰(zhàn)案例

    GO比較兩個(gè)對(duì)象是否相同實(shí)戰(zhàn)案例

    我們時(shí)常有比較兩個(gè)值是否相等的需求,下面這篇文章主要給大家介紹了關(guān)于GO比較兩個(gè)對(duì)象是否相同的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-12-12
  • go語(yǔ)言環(huán)境變量設(shè)置全過(guò)程

    go語(yǔ)言環(huán)境變量設(shè)置全過(guò)程

    這篇文章主要介紹了go語(yǔ)言環(huán)境變量設(shè)置全過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • Go代碼檢查工具golangci-lint安裝使用方法

    Go代碼檢查工具golangci-lint安裝使用方法

    這篇文章主要給大家介紹了關(guān)于Go代碼檢查工具golangci-lint安裝使用的相關(guān)資料,golangci-lint用于許多開(kāi)源項(xiàng)目中,比如kubernetes、Prometheus、TiDB等都使用golangci-lint用于代碼檢查,需要的朋友可以參考下
    2024-01-01
  • 深入了解Go語(yǔ)言中web框架的中間件運(yùn)行機(jī)制

    深入了解Go語(yǔ)言中web框架的中間件運(yùn)行機(jī)制

    大家在使用iris框架搭建web系統(tǒng)時(shí),一定會(huì)用到中間件。那么你了解中間件的運(yùn)行機(jī)制嗎?你知道為什么在iris和gin框架的請(qǐng)求處理函數(shù)中要加c.Next()函數(shù)嗎?本文就和大家一起探究該問(wèn)題的答案
    2023-02-02
  • golang變量uint、int大小溢出后的結(jié)果方式

    golang變量uint、int大小溢出后的結(jié)果方式

    在Go語(yǔ)言中,變量的大小溢出后,`uint`類(lèi)型會(huì)回繞到最小值,而`int`類(lèi)型會(huì)回繞到最大值的相反數(shù),例如,`uint8`溢出后會(huì)變成0,`int64`溢出后會(huì)變成最小的負(fù)數(shù)
    2024-12-12
  • go Http Post 發(fā)送文件流案例

    go Http Post 發(fā)送文件流案例

    這篇文章主要介紹了go Http Post 發(fā)送文件流案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • Go語(yǔ)言實(shí)現(xiàn)猜數(shù)字小游戲

    Go語(yǔ)言實(shí)現(xiàn)猜數(shù)字小游戲

    這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言實(shí)現(xiàn)猜數(shù)字小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-10-10

最新評(píng)論