這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
項目地址:https://github.com/huandu/xstrings
xstrings
是一個很簡單的 Go 語言庫,簡單說就是提供了一些標準庫 strings
沒提供但依然很有用的字串演算法。每個字串演算法都對效率進行了最佳化,所有函數都可以做到不超過 O(n)
的複雜度,並且盡量節省記憶體使用量,僅在需要分配記憶體的時候分配。
現在實現的演算法幾乎都是其他語言(主要是 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 裡面都沒有,網上甚至都搜不到有人實現過,所以乾脆自己來實現一個。
另一方面則是因為 Go 語言的命名風格比較另類,或者說沒有什麼曆史包袱,在其他語言都被 C 語言遺毒深深困擾的時候,Go 採用了一種小清新的風格命名函數,讀起來很舒服,只是從其他語言過來的人要想憑感覺找到某特定函數時會略微有些糾結,比如誰能想到 stricmp
在 Go 裡面竟然叫做 EqualFold
呢。所以我就乾脆寫一個函數對應表,把 Go 的 strings
函數和其他語言類似函數對應起來,也許有朝一日能夠幫到些許新晉 Go 開發人員吧。