欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

GoLang string與strings.Builder使用對比詳解

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

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

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

二、string類型的值

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

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

  • 裁剪操作可以使用切片表達式;
  • 拼接操作可以使用操作符+實現;

一個string的內容會被存儲在一塊連續(xù)的內存空間中,這個連續(xù)空間的字節(jié)數量也會被記錄下來,并用于表示該string值的長度。

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

	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)))

對string類型的值,進行切片操作,相當于對底層的字節(jié)數組做切片

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

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

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

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

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

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

3.1 Builder的拼接與Builder的自動擴容

可以通過Write、WriteByte、WriteRune、WriteString方法,把新的內容拼接到已存在的內容的尾部。

Builder會自動地對自身的內容容器進行擴容。擴容策略與切片的擴容策略一致。

3.2 手動擴容

Builder的值還可以手動擴容,通過調用Builder的Grow方法,就可以做到。

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

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

3.3 Builder的重用

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

四、strings.Builder的使用約束

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

只要調用了Builder值的拼接或擴容方法,就意味著真正使用。一旦真正使用,Builder值就不能被復制,否則調用副本的方法會引起panic。

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

雖然Builder值不可復制,但是它的指針指卻可以復制。復制的指針值會指向同一個Builder值。

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

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

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

strings.Reader 類型的值,可以讓我們很方便的讀取一個字符串中的內容。因為,在讀取的過程中,Reader值會保存已讀取的字節(jié)的計數。

一讀計數代表著下次讀取的起始索引位置。

Reader 正是依靠這樣的一個計數,以及針對字符串的切片表達式,從而實現快讀讀取。

通過Len方法和Size方法獲取已讀計數:

	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("以讀計數:%v\n", readingIndex)

Reader 的Seek方法用于設定下一次讀取的起始索引位置;如果把io.SeekCurrent 的值作為第二個參數值傳遞給該方法。那么它會依據當前的已讀計數,以及第一個參數offset的值來計算新的計數值。

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

相關文章

  • 使用Go添加HTTPS的實現代碼示例

    使用Go添加HTTPS的實現代碼示例

    這篇文章主要介紹了使用Go添加HTTPS的實現代碼示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-10-10
  • 從零開始學Golang的接口

    從零開始學Golang的接口

    本文主要介紹了從零開始學Golang的接口,原文中根據實例編碼詳細介紹的十分詳盡,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • golang如何實現mapreduce單進程版本詳解

    golang如何實現mapreduce單進程版本詳解

    這篇文章主要給大家介紹了關于golang如何實現mapreduce單進程版本的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2018-01-01
  • 我放棄Python轉Go語言的9大理由(附優(yōu)秀書籍推薦)

    我放棄Python轉Go語言的9大理由(附優(yōu)秀書籍推薦)

    這篇文章主要給大家介紹了關于我放棄Python轉Go語言的9大理由,以及給大家推薦了6本優(yōu)秀的go語言書籍,對同樣想學習golang的朋友們具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2017-10-10
  • golang sql連接池的實現方法詳解

    golang sql連接池的實現方法詳解

    database/sql是golang的標準庫之一,它提供了一系列接口方法,用于訪問關系數據庫。下面這篇文章主要給大家介紹了關于golang sql連接池用法的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面來一起看看吧
    2018-09-09
  • Golang單元測試與覆蓋率的實例講解

    Golang單元測試與覆蓋率的實例講解

    這篇文章主要介紹了Golang單元測試與覆蓋率的實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • Go語言開發(fā)k8s之Deployment操作解析

    Go語言開發(fā)k8s之Deployment操作解析

    這篇文章主要為大家介紹了Go語言開發(fā)k8s之Deployment操作解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-06-06
  • Go語言下載網絡圖片或文件的方法示例

    Go語言下載網絡圖片或文件的方法示例

    這篇文章主要介紹了Go語言下載網絡圖片或文件的方法示例,文中通過示例代碼介紹的非常詳細,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-12-12
  • 詳解golang碎片整理之 fmt.Scan

    詳解golang碎片整理之 fmt.Scan

    本文介紹了從golang語言中fmt包從標準輸入獲取數據的Scan系列函數、從io.Reader中獲取數據的Fscan系列函數以及從字符串中獲取數據的Sscan系列函數的用法,感興趣的小伙伴們可以參考一下
    2019-05-05
  • golang讀取各種配置文件(ini、json、yaml)

    golang讀取各種配置文件(ini、json、yaml)

    日常項目中,讀取各種配置文件是避免不了的,本文主要介紹了golang讀取各種配置文件(ini、json、yaml),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-05-05

最新評論