項目地址:https://github.com/huandu/xstringsgit
xstrings
是一個很簡單的 Go 語言庫,簡單說就是提供了一些標準庫 strings
沒提供但依然頗有用的字符串算法。每一個字符串算法都對效率進行了優化,全部函數均可以作到不超過 O(n)
的複雜度,而且儘可能節省內存使用,僅在須要分配內存的時候分配。github
如今實現的算法幾乎都是其餘語言(主要是 Python/Ruby/PHP/Perl)標準庫裏提供的算法,用 Go 從新實現一遍。將來也許我還會繼續加入更多的方法,不過我不但願這個庫成爲一個算法大雜燴,所以僅僅會考慮那些特別有名且語言無關的函數。算法
Go 的 strings
操做字符串的時候都是以 rune
爲單位進行,但 string
類型卻只能以 byte
爲單位進行下標訪問,要想使用 rune
就得用 []rune(str)
進行轉換(有額外內存分配)或者 utf8. DecodeRuneInString(str)
一個個解碼。爲了和標準庫保持高度統一,xstrings
也徹底以 rune
爲單位操做字符串,這使得算法的實現難度比其餘語言稍高一點,不過總之都搞定了,這種有一點挑戰的感受很不錯。٩( 'ω' )و函數
作這個項目有兩方面緣由。優化
一方面是由於 Go 的 strings
自帶算法實在太少,其餘語言裏面一些特別有趣的字符串算法,好比 Ruby 的 String#succ
/String#tr
在 Go 裏面都沒有,網上甚至都搜不到有人實現過,因此乾脆本身來實現一個。code
另外一方面則是由於 Go 語言的命名風格比較另類,或者說沒有什麼歷史包袱,在其餘語言都被 C 語言遺毒深深困擾的時候,Go 採用了一種小清新的風格命名函數,讀起來很舒服,只是從其餘語言過來的人要想憑感受找到某特定函數時會略微有些糾結,好比誰能想到 stricmp
在 Go 裏面居然叫作 EqualFold
呢。因此我就乾脆寫一個函數對應表,把 Go 的 strings
函數和其餘語言相似函數對應起來,也許有朝一日可以幫到些許新晉 Go 開發者吧。內存