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

淺析Golang中字符串拼接問題

 更新時間:2023年04月11日 14:15:25   作者:落風雪  
Go的字符串是一個不可改變的數(shù)據(jù)結(jié)構(gòu),這和其他語言如JAVA,C++等的設定很類似.總體來說,有如下五種拼接方式,下面我們將論述各種方式的性能問題,以及如何選擇

1.概述

Go的字符串是一個不可改變的數(shù)據(jù)結(jié)構(gòu),這和其他語言如JAVA,C++等的設定很類似.總體來說,有如下五種拼接方式,下面我們將論述各種方式的性能問題,以及如何選擇.

(golang字符串,內(nèi)存模型)

type StringHeader struct {
	Data uintptr
	Len  int
}

注意:字符串具有不可改變的特性,即便通過指針等變相操作

	var a string = "old"
	bptr := (*reflect.StringHeader)(unsafe.Pointer(&a))
	dataPtr := (*byte)(unsafe.Pointer(bptr.Data))
	var b = [3]byte{'n', 'e', 'w'}
	*dataPtr = b[0] //報錯
	fmt.Println(bptr)

2.Golang中字符串拼接的方式

方式一、直接+

當使用連接符 + 拼接兩個字符串時,會生成一個新的字符串并開辟新的內(nèi)存空間,空間大小等于兩個字符串之和。在訓中中時,不斷拼接新的字符串,這樣就會不斷申請內(nèi)存空間, 性能就會越來越差。 所以,在字符串密集拼接場景中,使用 + 會嚴重降低性能。包括熱路徑的代碼.

方式二、strings.Builder

func Benchmark_StringsBuilder(b *testing.B) {
	var sb strings.Builder
	for i := 0; i < b.N; i++ {
		sb.WriteString("hello world")
	}
	_ = sb.String()
}

方式三、bytes.Buffer

func Benchmark_BytesBuffer(b *testing.B) {
	var buf bytes.Buffer
	for i := 0; i < b.N; i++ {
		buf.WriteString("hello world")
	}
	_ = buf.String()
}

方式四、fmt.Fprint(&buf,&str)

方式五、strings.Join

性能不是最優(yōu),但在切片的情況下,可以用來拼接

3.總結(jié)

Benchmark_StringAdd Benchmark_StringAdd-8 117806 127059 ns/op Benchmark_BytesBuffer Benchmark_BytesBuffer-8 38938282 25.88 ns/op Benchmark_StringsBuilder Benchmark_StringsBuilder-8 57249450 18.53 ns/op

3.1 性能方面,strings.Builder 比 bytes.Buffer 快差不多 20%,

原因:strings.Builder 和 bytes.Buffer 底層都是一個 []byte,但是 bytes.Buffer 轉(zhuǎn)換字符串時會重新申請內(nèi)存空間用來存放, 而 strings.Builder 直接將底層的 []byte 利用指針的方式強轉(zhuǎn)為字符串.

//strings.Builder的String()
func (b *Builder) String() string {
    return *(*string)(unsafe.Pointer(&b.buf))
}

//bytes.Builder的String()
func (b *Buffer) String() string {
    if b == nil {
        // Special case, useful in debugging.
        return "<nil>"
    }
    return string(b.buf[b.off:])
}

3.2 strings.Builder通常性能最優(yōu),但底層依賴于[]byte,所以如果平凡擴容就不妙了,因此我們需要借助它的Grow方法,以已分配最終[]byte的容量,避免因為擴容帶來的性能損失

func Benchmark_StringConcat(b *testing.B) {
    str := "hello world"
    var sb strings.Builder
    sb.Grow(b.N * len(str))
    for i := 0; i < b.N; i++ {
        sb.WriteString(str)
    }
    _ = sb.String()
}

3.3 strings.Builder沒有拷貝構(gòu)造(借用C++說法),因為

type Builder struct {  
addr *Builder // of receiver, to detect copies by value  
buf []byte  //如果拷貝,這個buf共享,最后導致數(shù)據(jù)混亂
}

到此這篇關(guān)于淺析Golang中字符串拼接問題的文章就介紹到這了,更多相關(guān)Golang字符串拼接內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go語言kube-scheduler深度剖析與開發(fā)之pod調(diào)度

    Go語言kube-scheduler深度剖析與開發(fā)之pod調(diào)度

    這篇文章主要為大家介紹了Go語言kube-scheduler深度剖析與開發(fā),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04
  • 詳解Go語言中單鏈表的使用

    詳解Go語言中單鏈表的使用

    鏈表由一系列結(jié)點(鏈表中每一個元素稱為結(jié)點)組成,結(jié)點可以在運行時動態(tài)生成。本文將通過實例為大家詳解Go語言中單鏈表的常見用法,感興趣的可以了解一下
    2022-08-08
  • Go語言學習之context包的用法詳解

    Go語言學習之context包的用法詳解

    日常Go開發(fā)中,Context包是用的最多的一個了,幾乎所有函數(shù)的第一個參數(shù)都是ctx,那么我們?yōu)槭裁匆獋鬟fContext呢,Context又有哪些用法,底層實現(xiàn)是如何呢?相信你也一定會有探索的欲望,那么就跟著本篇文章,一起來學習吧
    2022-10-10
  • 基于Go+WebSocket實現(xiàn)實時通信功能

    基于Go+WebSocket實現(xiàn)實時通信功能

    在互聯(lián)網(wǎng)應用程序中,實時通信是一種非常重要的功能,WebSocket 是一種基于 TCP 的協(xié)議,它允許客戶端和服務器之間進行雙向通信,本文將介紹如何使用 Golang 創(chuàng)建單獨的 WebSocket 會話,以實現(xiàn)實時通信功能,需要的朋友可以參考下
    2023-10-10
  • Go語言實現(xiàn)Fibonacci數(shù)列的方法

    Go語言實現(xiàn)Fibonacci數(shù)列的方法

    這篇文章主要介紹了Go語言實現(xiàn)Fibonacci數(shù)列的方法,實例分析了使用遞歸和不使用遞歸兩種技巧,并對算法的效率進行了對比,需要的朋友可以參考下
    2015-02-02
  • go?proto編譯引用外部包問題解決方案示例

    go?proto編譯引用外部包問題解決方案示例

    這篇文章主要為大家介紹了go?proto編譯引用外部包問題解決方案示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-10-10
  • 在Golang中正確的修改HTTPRequest的Host的操作方法

    在Golang中正確的修改HTTPRequest的Host的操作方法

    我們工作中經(jīng)常需要通過HTTP請求Server的服務,比如腳本批量請求接口跑數(shù)據(jù),由于一些網(wǎng)關(guān)策略,部分Server會要求請求中Header里面附帶Host參數(shù),所以本文給大家介紹了如何在Golang中正確的修改HTTPRequest的Host,需要的朋友可以參考下
    2023-12-12
  • Go單元測試對數(shù)據(jù)庫CRUD進行Mock測試

    Go單元測試對數(shù)據(jù)庫CRUD進行Mock測試

    這篇文章主要為大家介紹了Go單元測試對數(shù)據(jù)庫CRUD進行Mock測試的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • Go語言題解LeetCode455分發(fā)餅干示例詳解

    Go語言題解LeetCode455分發(fā)餅干示例詳解

    這篇文章主要為大家介紹了Go語言題解LeetCode455分發(fā)餅干示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • 下載golang.org/x包的操作方法

    下載golang.org/x包的操作方法

    今天小編就為大家分享一篇下載golang.org/x包的操作方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07

最新評論