大家好,我是:『猿謀人
』。今天來和大家聊聊 Go語言 裡的字符串拼接問題。也許在你開發第一個 Go語言 項目時,你並不會太在意這個問題。那當你在開始寫第二個、第三個項目時呢?
本著程序猿天生的鑽牛角尖鑽到死的精神,或許你會問:哪種字符串拼接更高效一些呢?那麼今天帶大家一探究竟。
常用拼接方式
- fmt.Sprintf() 函數
- 直接字符串拼接符號:+
- bytes.Buffer 和 strings.Builder
fmt.Spintf 函數
如上三種便是在日常開發中常用字符串拼接方式,我們將對這三種不同的方式編寫不同的 benchmark 測試,這裡不得不的說的是,在 Go語言 中做測試是非常方便的,我們只需要創建一個以 _test 結尾的 go文件即可:concat_test.go
Go語言中,fmt 包被用來格式化標準輸出的包,包中 Sprintf 函數將根據我們傳入的不同參數類型配置,並返回格式化後的字符串。我們之所以要測試該函數,是因為我們經常使用此函數來做字符串拼接,並且自動轉換不同數據類型。
在這裡我們編寫了一個 BenchmarkPrint 函數(Go語言規定,基準測試的函數必須以 Benchmark 開頭),b.N 是 Go benchmark 內置變量,代表會循環 N 次,這個 N 具體取值由運行環境本身決定,我們不需要關心。
在這裡,為了模擬常規的字符串拼接行為,我傳入一個整數:2020,一個字符串:新年快樂
一個字符串拼接涉及不同數據類型的值拼接是非常常見的。
使用字符串拼接符號:+
使用 + 符號也是家常便飯,不妨看看這種性能如何。
在這裡我編寫了兩個測試函數,一個是分三次賦值並拼接字符串,一個是一次性完成三次拼接,待會兒你會看到這兩種方式會有意想不到的性能差別。
bytes.Buffer 和 strings.Builder
Go語言中內置了兩種字符串拼接方式:bytes.Buffer 和 strings.Builder 在Go 1.10 之前只有 bytes.Buffer ,從 Go 1.10 開始新增了 strings.Builder 旨在替換 bytes.Buffer
不妨,我們也給出這兩種拼接方式的性能測試結果。
測試結果
當前測試使用go語言版本:go 1.13.1
- 使用 fmt.Sprintf 函數和 + 符號拼接性能接近。
- + 符號多次賦值拼接和一次性拼接性能差距很大,3倍差距。
- 內置 bytes.Buffer 性能是前兩種的1.5倍左右。
閱讀更多 南來的小夥兒 的文章