字符串替換NewReplacer竟然幹不過Replace多次替換方式

編寫代碼時,字符串替換操作是常有的事情,Go 語言中也為我們內置了強大的字符串替換方法,總共是涉及到三個函數:

<code>Replace(s, old, new string, n int)
ReplaceAll(s, old, new string)
NewReplacer(oldnew ...string)/<code>

Replace() 函數可以使用第四個參數 n 來控制從匹配的字符串中允許最多替換的個數(順序是從左至右),如果 n < 0 那麼其實就等價於 ReplaceAll() 函數,ReplaceAll() 內部實現其實就是 n = -1 時的 Replace() 函數,不妨看看如下源代碼:

字符串替換NewReplacer竟然幹不過Replace多次替換方式

因此,不要被名字所誤解,其實 Replace() 也能實現全局的文本替換工作。請看如下:

只替換第一個 Cat

字符串替換NewReplacer竟然幹不過Replace多次替換方式

打印結果:

<code>Dog NewCat Mouse Duck Cat, the Cat is gray/<code>

替換所有 Cat

字符串替換NewReplacer竟然幹不過Replace多次替換方式

打印結果:

<code>Dog NewCat Mouse Duck NewCat, the NewCat is gray/<code>

請記住一點:n 代表的是替換多少個,而不是從第幾個開始替換!

替換多個值

Replace() 和 ReplaceAll() 函數有個比較尷尬的地方,不能實現同時替換多個值。如上實例中,如果我們希望同時替換文本中的 Dog 和 Cat 時,這裡函數就有點力不從心了,所以就有了 strings.NewReplacer() 函數

strings.NewReplacer() 函數允許我們批量替換多個不同的字符串,但該函數參數要求必須是成對的,第一個參數為需要替換的值,第二參數為替換後的值,第三,第四個,一次類推,兩兩為一組,如下實例,我們將 Dog 和 Cat 同時替換為新值:

字符串替換NewReplacer竟然幹不過Replace多次替換方式

打印結果:

<code>NewDog NewCat Mouse Duck NewCat, the NewCat is gray/<code>

疑問?

批量替換多個值,使用 NewReplacer() 函數 還是使用 ReplaceAll() 或 Replace() 替換多次,誰的性能更好呢?我們不妨來做一個驗證:

字符串替換NewReplacer竟然幹不過Replace多次替換方式

這裡我們編寫了三個 Benchmark

函數,BenchmarkReplacer() 測試 Replacer() 函數效果,BenchmarkReplace() 和 BenchmarkReplaceAll() 函數分別代表 Replace 和 ReplaceAll, 測試結果如下,可能令你意想不到:

<code>goos: darwin
goarch: amd64
pkg: github.com/apptut/go-labs/strings
BenchmarkReplacer-4 1000000000 0.0161 ns/op
BenchmarkReplaceAll-4 1000000000 0.00249 ns/op
BenchmarkReplace-4 1000000000 0.00269 ns/op/<code>

從結果上來說,竟然 Replace() 和 ReplaceAll() 多次替換方式竟然比 NewReplacer()函數要好7倍左右,這個結論有點讓人大跌眼鏡!


分享到:


相關文章: