我認真擼了一把Go語言的字符串拼接

大家好,我是:猿謀人

』。今天來和大家聊聊 Go語言 裡的字符串拼接問題。

也許在你開發第一個 Go語言 項目時,你並不會太在意這個問題。那當你在開始寫第二個、第三個項目時呢?

本著程序猿天生的鑽牛角尖鑽到死的精神,或許你會問:哪種字符串拼接更高效一些呢?那麼今天帶大家一探究竟。

我認真擼了一把Go語言的字符串拼接

常用拼接方式

  1. fmt.Sprintf() 函數
  2. 直接字符串拼接符號:+
  3. bytes.Buffer 和 strings.Builder

fmt.Spintf 函數

如上三種便是在日常開發中常用字符串拼接方式,我們將對這三種不同的方式編寫不同的 benchmark 測試,這裡不得不的說的是,在 Go語言 中做測試是非常方便的,我們只需要創建一個以 _test 結尾的 go文件即可:concat_test.go

Go語言中,fmt 包被用來格式化標準輸出的包,包中 Sprintf 函數將根據我們傳入的不同參數類型配置,並返回格式化後的字符串。我們之所以要測試該函數,是因為我們經常使用此函數來做字符串拼接,並且自動轉換不同數據類型。

我認真擼了一把Go語言的字符串拼接

在這裡我們編寫了一個 BenchmarkPrint 函數(Go語言規定,基準測試的函數必須以 Benchmark 開頭),b.N 是 Go benchmark 內置變量,代表會循環 N 次,這個 N 具體取值由運行環境本身決定,我們不需要關心。

在這裡,為了模擬常規的字符串拼接行為,我傳入一個整數:2020,一個字符串:新年快樂

一個字符串拼接涉及不同數據類型的值拼接是非常常見的。

使用字符串拼接符號:+

使用 + 符號也是家常便飯,不妨看看這種性能如何。

我認真擼了一把Go語言的字符串拼接

在這裡我編寫了兩個測試函數,一個是分三次賦值並拼接字符串,一個是一次性完成三次拼接,待會兒你會看到這兩種方式會有意想不到的性能差別。

bytes.Buffer 和 strings.Builder

Go語言中內置了兩種字符串拼接方式:bytes.Buffer 和 strings.Builder 在Go 1.10 之前只有 bytes.Buffer ,從 Go 1.10 開始新增了 strings.Builder 旨在替換 bytes.Buffer

我認真擼了一把Go語言的字符串拼接

不妨,我們也給出這兩種拼接方式的性能測試結果。

測試結果

當前測試使用go語言版本:go 1.13.1

我認真擼了一把Go語言的字符串拼接

  1. 使用 fmt.Sprintf 函數和 + 符號拼接性能接近。
  2. + 符號多次賦值拼接和一次性拼接性能差距很大,3倍差距。
  3. 內置 bytes.Buffer 性能是前兩種的1.5倍左右。


分享到:


相關文章: