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

GoLang string與strings.Builder使用對(duì)比詳解

 更新時(shí)間:2023年03月17日 09:58:45   作者:鯤鵬飛九萬(wàn)里  
這篇文章主要介紹了GoLang string與strings.Builder使用對(duì)比,Builder 用于使用 Write 方法有效地構(gòu)建字符串。它最大限度地減少了內(nèi)存復(fù)制。零值可以使用了。不要復(fù)制非零生成器

一、strings.Builder的優(yōu)勢(shì)

  • 以存在的內(nèi)容不可變,但可以拼接更多的內(nèi)容;
  • 減少了內(nèi)存分配和內(nèi)存拷貝的次數(shù);
  • 可將可容重疊,可重用值;

二、string類型的值

在Go語(yǔ)言中,string類型的值是不可變的。

基于原字符串的裁剪和拼接操作:

  • 裁剪操作可以使用切片表達(dá)式;
  • 拼接操作可以使用操作符+實(shí)現(xiàn);

一個(gè)string的內(nèi)容會(huì)被存儲(chǔ)在一塊連續(xù)的內(nèi)存空間中,這個(gè)連續(xù)空間的字節(jié)數(shù)量也會(huì)被記錄下來(lái),并用于表示該string值的長(zhǎng)度。

對(duì)string類型的值,執(zhí)行l(wèi)en() 方法,得到的是字節(jié)的數(shù)量。

	var str01 string
	str01 = "Go,你好"
	// len(string) : 11
	fmt.Printf("len(string) : %v \n", len(str01))
	// len([]char): 5
	fmt.Printf("len([]char): %v\n", len([]rune(str01)))
	// len([]byte): 11
	fmt.Printf("len([]byte): %v\n", len([]byte(str01)))

對(duì)string類型的值,進(jìn)行切片操作,相當(dāng)于對(duì)底層的字節(jié)數(shù)組做切片

	// 在string類型的值上進(jìn)行切片操作,相當(dāng)于對(duì)底層的字節(jié)數(shù)組做切片
	fmt.Println(str01[0:3]) // Go?
	fmt.Println(str01[0:5]) // Go,

在執(zhí)行字符串拼接的時(shí)候,會(huì)把所有被拼接的字符串依次拷貝到一個(gè)嶄新且足夠大的連續(xù)內(nèi)存空間中,并把相應(yīng)指針指的string值作為結(jié)果返回。

三、與string相比Builder的優(yōu)勢(shì)體現(xiàn)在拼接方面

與string相比,strings.Builder 的優(yōu)勢(shì)最要體現(xiàn)在字符串拼接方面。

Builder有一個(gè)內(nèi)容容器,它是一個(gè)以byte為元素類型的切片(簡(jiǎn)稱字節(jié)切片)。

Builder類型的值只能被拼接或完全覆蓋。

3.1 Builder的拼接與Builder的自動(dòng)擴(kuò)容

可以通過(guò)Write、WriteByte、WriteRune、WriteString方法,把新的內(nèi)容拼接到已存在的內(nèi)容的尾部。

Builder會(huì)自動(dòng)地對(duì)自身的內(nèi)容容器進(jìn)行擴(kuò)容。擴(kuò)容策略與切片的擴(kuò)容策略一致。

3.2 手動(dòng)擴(kuò)容

Builder的值還可以手動(dòng)擴(kuò)容,通過(guò)調(diào)用Builder的Grow方法,就可以做到。

Grow方法接受一個(gè)int類型的參數(shù)n,這個(gè)參數(shù)表示要擴(kuò)充的字節(jié)數(shù)量。

如果未用容量大于或等于n,Grow方法可能什么都不做。

3.3 Builder的重用

通過(guò)調(diào)用Reset方法,可以讓Builder值重新回到零值的狀態(tài),就像它從未被使用一樣。

四、strings.Builder的使用約束

  • springs.Builder 類型的值在已被真正使用后,就不可再被復(fù)制。
  • 由于其內(nèi)容不是完全不可變的,需要使用方自行解決操作沖突和并發(fā)安全的問(wèn)題。

只要調(diào)用了Builder值的拼接或擴(kuò)容方法,就意味著真正使用。一旦真正使用,Builder值就不能被復(fù)制,否則調(diào)用副本的方法會(huì)引起panic。

	var sb01 strings.Builder
	sb01.WriteString("Go")
	sb02 := sb01
	// sb02.Grow(1) // 這里會(huì)引起恐慌panic
	_ = sb02

雖然Builder值不可復(fù)制,但是它的指針指卻可以復(fù)制。復(fù)制的指針值會(huì)指向同一個(gè)Builder值。

對(duì)于處于零值狀態(tài)的Builder值,復(fù)制不會(huì)有任何問(wèn)題。所以,只要在傳遞之前調(diào)用Reset方法即可。

	var sb01 strings.Builder
	sb01.WriteString("Go")
    sb01.Reset()
	sb03 := sb01
	sb03.Grow(1)

五、strings.Reader類型的值可以高效讀取字符串

strings.Reader 類型的值,可以讓我們很方便的讀取一個(gè)字符串中的內(nèi)容。因?yàn)?,在讀取的過(guò)程中,Reader值會(huì)保存已讀取的字節(jié)的計(jì)數(shù)。

一讀計(jì)數(shù)代表著下次讀取的起始索引位置。

Reader 正是依靠這樣的一個(gè)計(jì)數(shù),以及針對(duì)字符串的切片表達(dá)式,從而實(shí)現(xiàn)快讀讀取。

通過(guò)Len方法和Size方法獲取已讀計(jì)數(shù):

	var reader1 strings.Reader
	reader1 = *strings.NewReader("Go, 你好")
	ch, size, err := reader1.ReadRune()
	fmt.Printf("%v, %v, %v\n", string(ch), size, err)
	readingIndex := reader1.Size() - int64(reader1.Len())
	fmt.Printf("以讀計(jì)數(shù):%v\n", readingIndex)

Reader 的Seek方法用于設(shè)定下一次讀取的起始索引位置;如果把io.SeekCurrent 的值作為第二個(gè)參數(shù)值傳遞給該方法。那么它會(huì)依據(jù)當(dāng)前的已讀計(jì)數(shù),以及第一個(gè)參數(shù)offset的值來(lái)計(jì)算新的計(jì)數(shù)值。

到此這篇關(guān)于GoLang string與strings.Builder使用對(duì)比詳解的文章就介紹到這了,更多相關(guān)Go string與strings.Builder內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • golang實(shí)現(xiàn)大文件上傳功能全過(guò)程

    golang實(shí)現(xiàn)大文件上傳功能全過(guò)程

    Go語(yǔ)言可以用來(lái)實(shí)現(xiàn)大文件傳輸,下面這篇文章主要給大家介紹了關(guān)于golang實(shí)現(xiàn)大文件上傳功能的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-07-07
  • go常用指令之go?mod詳解

    go常用指令之go?mod詳解

    當(dāng)go命令運(yùn)行時(shí),它查找當(dāng)前目錄然后查找相繼的父目錄來(lái)找出 go.mod,下面這篇文章主要給大家介紹了關(guān)于go常用指令之go?mod的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08
  • 詳解Go語(yǔ)言中切片的長(zhǎng)度與容量的區(qū)別

    詳解Go語(yǔ)言中切片的長(zhǎng)度與容量的區(qū)別

    切片可以看成是數(shù)組的引用,切片的長(zhǎng)度是它所包含的元素個(gè)數(shù)。切片的容量是從它的第一個(gè)元素到其底層數(shù)組元素末尾的個(gè)數(shù)。本文將通過(guò)示例詳細(xì)講講Go語(yǔ)言中切片的長(zhǎng)度與容量的區(qū)別,需要的可以參考一下
    2022-11-11
  • Go語(yǔ)言中進(jìn)行API限流的實(shí)戰(zhàn)詳解

    Go語(yǔ)言中進(jìn)行API限流的實(shí)戰(zhàn)詳解

    API?限流是控制和管理應(yīng)用程序訪問(wèn)量的重要手段,旨在防止惡意濫用、保護(hù)后端服務(wù)的穩(wěn)定性和可用性,下面我們就來(lái)看看如何在Go語(yǔ)言中具體實(shí)現(xiàn)吧
    2025-01-01
  • 使用Go語(yǔ)言實(shí)現(xiàn)一個(gè)簡(jiǎn)單的無(wú)界資源池

    使用Go語(yǔ)言實(shí)現(xiàn)一個(gè)簡(jiǎn)單的無(wú)界資源池

    本文我們希望通過(guò)go語(yǔ)言實(shí)現(xiàn)一個(gè)簡(jiǎn)單的資源池,而這個(gè)資源池的資源包括但不限于數(shù)據(jù)庫(kù)連接池,線程池,協(xié)程池,網(wǎng)絡(luò)連接池,只要這些資源實(shí)現(xiàn)我們指定的關(guān)閉方法,則都可以通過(guò)我們封裝的資源池進(jìn)行統(tǒng)一管理,文中通過(guò)代碼示例給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2024-05-05
  • Golang中函數(shù)(Function)和方法(Method)的區(qū)別詳解

    Golang中函數(shù)(Function)和方法(Method)的區(qū)別詳解

    在Golang中,大家必然會(huì)頻繁使用到函數(shù)(Function)和方法(Method),但是有的同學(xué)可能并沒(méi)有注意過(guò)函數(shù)和方法的異同點(diǎn),函數(shù)和方法都是用來(lái)執(zhí)行特定任務(wù)的代碼塊,雖然很相似,但也有很大的區(qū)別,所以本文將詳細(xì)講解函數(shù)和方法的定義以及它們的異同點(diǎn)
    2023-07-07
  • Go語(yǔ)言變量初始化的實(shí)現(xiàn)示例

    Go語(yǔ)言變量初始化的實(shí)現(xiàn)示例

    在Go語(yǔ)言中,變量的初始化是編寫程序時(shí)經(jīng)常遇到的重要操作之一,本文主要介紹了Go語(yǔ)言變量初始化的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-04-04
  • golang批量執(zhí)行任務(wù)的通用模板分享

    golang批量執(zhí)行任務(wù)的通用模板分享

    這篇文章主要為大家詳細(xì)介紹了golang實(shí)現(xiàn)批量執(zhí)行任務(wù)的通用模板,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解一下
    2023-11-11
  • Go中的函數(shù)選項(xiàng)模式(Functional Options Pattern)詳解

    Go中的函數(shù)選項(xiàng)模式(Functional Options Pattern)詳解

    在 Go 語(yǔ)言中,函數(shù)選項(xiàng)模式是一種優(yōu)雅的設(shè)計(jì)模式,用于處理函數(shù)的可選參數(shù),本文將對(duì)其進(jìn)行講解,準(zhǔn)備好了嗎,快跟隨著本文一探究竟吧
    2023-06-06
  • 解析Go 標(biāo)準(zhǔn)庫(kù) http.FileServer 實(shí)現(xiàn)靜態(tài)文件服務(wù)

    解析Go 標(biāo)準(zhǔn)庫(kù) http.FileServer 實(shí)現(xiàn)靜態(tài)文件服務(wù)

    http.FileServer 方法屬于標(biāo)準(zhǔn)庫(kù) net/http,返回一個(gè)使用 FileSystem 接口 root 提供文件訪問(wèn)服務(wù)的 HTTP 處理器。下面通過(guò)本文給大家介紹Go 標(biāo)準(zhǔn)庫(kù) http.FileServer 實(shí)現(xiàn)靜態(tài)文件服務(wù)的相關(guān)知識(shí),感興趣的朋友一起看看吧
    2018-08-08

最新評(píng)論

黎平县| 道真| 江阴市| 石林| 中牟县| 红安县| 井冈山市| 南川市| 冕宁县| 防城港市| 饶河县| 乐东| 元江| 科技| 鹰潭市| 阳东县| 同心县| 嵊泗县| 商水县| 西昌市| 宜兰市| 民县| 长宁县| 炉霍县| 策勒县| 巴中市| 中山市| 周宁县| 大新县| 衢州市| 遂昌县| 葫芦岛市| 岳西县| 富川| 颍上县| 逊克县| 武宣县| 夏津县| 南郑县| 文化| 营口市|