『Go 內(nèi)置庫第一季:strings』

ZERO_FUCKS.png

大家好,我叫謝偉,是一名程序員。

換了工作,一直沒太多精力進行輸出,還是需要花些時間,進行總結(jié),不然對 Go 生疏了。

這一季的系列主題,主要圍繞內(nèi)置庫進行。如果一個人寫的代碼比你的贊,那么他對內(nèi)置庫的熟悉程度一定比你強。

對內(nèi)置庫的熟悉,一定程度上能夠幫助大家編寫更優(yōu)的代碼,如果不熟悉內(nèi)置的 API,有可能會自己去實現(xiàn),你自己思考的不一定比內(nèi)置的實現(xiàn)優(yōu)。

原則:

  • 熟悉內(nèi)置 API
  • 補充新知識
  • 彌補的短板

大綱

  • 猜測會提供的用法

    • 大小寫轉(zhuǎn)化
      • 自己的思路:26 個小寫字母,26 個大寫字母
    • 是否前綴,后綴
      • 函數(shù)命名方式:has, is
      • 自己的思路
    • 分割
    • 轉(zhuǎn)換
    • 包含
    • 統(tǒng)計
    • 去除指定字符
    • 字符
  • 基本用法

  • 學(xué)習(xí)到的

    • 函數(shù)命名
      • is
      • has
      • can
      • should
      • ok
      • found
      • done
      • success
    • 多個用復(fù)數(shù)形式:tests , testcases, tt
    • 匿名字段
    • 匿名結(jié)構(gòu)體
      • 定義全局變量
      • 測試數(shù)據(jù)集合:切片

自己總結(jié)的用法

字符串是內(nèi)置的一種重要的數(shù)據(jù)類型,字符串的處理,也是日常編寫代碼中非常重要的一環(huán)。

結(jié)合自身的編寫代碼的經(jīng)驗,回顧下。

只有自己先回顧,再查閱標(biāo)準(zhǔn)的 API,才能和自己產(chǎn)生聯(lián)系

  • 字符串清理
比如爬蟲,經(jīng)常會處理網(wǎng)頁的源代碼,獲取到的字符串中可以夾雜著不需要的字符串,那么這個時候需要進行字符串的清理

1. 替換: 替換指定子串或者字符
2. 去除空格:和替換還不一樣

  • 包含
包含關(guān)系:

1. 原始字符串是否包含子串
2. 子串是否在原始字符串中
3. 是否以某子串開頭,是否以某子串結(jié)束

  • 分割
將原始字符串進行按指定一個或者多個字符分割,結(jié)果返回一個 數(shù)組類型

  • 統(tǒng)計
嚴格上屬于包含關(guān)系中的一種

  • 大小寫轉(zhuǎn)換
這個功能很常見,比如常見搜索功能,有些系統(tǒng)嚴格區(qū)分大小寫,而有些系統(tǒng)不區(qū)分大小寫,或者支持模糊搜索,這種情況下,大小寫的轉(zhuǎn)換的功能就很適用

私以為,上述用法囊括了絕大多數(shù)的場景。

對應(yīng)的函數(shù)的具體的用法

  • 字符串清理
func stringsClean(value string) string {
    newReplacer := strings.NewReplacer("\n", "", "\t", " ")
    newValue := newReplacer.Replace(value)
    return strings.TrimSpace(newValue)
}


  • 包含

func stringsContains(value string, subString string) bool {
    return strings.Contains(value, subString)
}
  • 分割
func stringsSplit(value string, splitString string) []string {
    return strings.Split(value, splitString)
}

同類型的用法:

  • strings.SplitN
  • strings.SplitAfterN
  • strings.Split
  • strings.SplitAfter

為什么要多設(shè)計其他方法?

  • 部分分割的需求

  • 按要求部分分割的需求

  • 統(tǒng)計

func stringsCount(value string, subString string) int {
    return strings.Count(value, subString)
}

子串統(tǒng)計會存在什么問題?

  • 統(tǒng)計的匹配規(guī)則設(shè)置不一樣的,結(jié)果不一樣?
  • 匹配空子串怎么算?

比如: fivevev , vev 結(jié)果是1, 還是2?

  • 大小寫轉(zhuǎn)換

func stringsLowerOrUpper(value string, toLower bool) string {
    if toLower {
        return strings.ToLower(value)
    }
    return strings.ToUpper(value)
}

會不會有疑問:遇到“數(shù)值型”的字符串怎么處理?遇到特殊字符怎么處理?

答案:原樣輸出,只處理26個英文字母

標(biāo)準(zhǔn)核心函數(shù)

包含

還存在其他包含函數(shù):

  • strings.Contains
  • strings.ContainsAny
  • strins.ContainsRune

字符 和 ASCII 的操作?

var charOne rune = 'a'

fmt.Print(string(charOne), " " , int(charOne))
>> a  97

統(tǒng)計

采用Rabin-Karp算法。

  • 統(tǒng)計空字符時,為字符串長度值

分割

這里有兩個比較有意思的函數(shù):

  • Fields 和 FieldsFunc

怎么用?


func stringsFiled(value string) []string {
    return strings.Fields(value)
}

func main() {

    fields := stringsFiled("How can i become gopher           ")
    for index, field := range fields {
        fmt.Println(index, field, len(field))
    }

}

>>
0 How 3
1 can 3
2 i 1
3 become 6
4 gopher 6

看上去按空格分割,F(xiàn)ieldsFunc 則按指定字符分割

前綴和后綴

  • HasPrefix
  • HasSuffix

注意:命名

布爾類型的建議這些詞

  • is
  • can
  • has
  • should
  • found
  • success
  • ok

替換

  • Replace 單個字符替換
  • Replacer 多個字符替換

切片或者數(shù)組轉(zhuǎn)換為字符串

  • Join

去除字符

  • func Trim(s string, cutset string) string
  • func TrimFunc(s string, f func(rune) bool) string
  • func TrimLeft(s string, cutset string) string
  • func TrimLeftFunc(s string, f func(rune) bool) string
  • func TrimPrefix(s, prefix string) string
  • func TrimRight(s string, cutset string) string
  • func TrimRightFunc(s string, f func(rune) bool) string
  • func TrimSpace(s string) string
  • func TrimSuffix(s, suffix string) string

常用的有 TrimSpace, 去除字符串前后端空格。

其他

  • 如何表示復(fù)數(shù)形式?
1. 直接單詞的復(fù)數(shù)形式: 比如 testcases

for index, testcase := range testcases{

}

2. 雙寫字符: 比如 tt

for index, t := range tt {

}


  • 匿名結(jié)構(gòu)體

有哪些用途?

1. 全局變量

var globalVar struct {
    name string
    age int
}

globalVar.name = "xieWei"
globalVar.age = 20

2. 測試集合

var test = []struct{
    in string
    out string
}{
    {
        in: "1",
        out: "2",
    },
}
  • 值得學(xué)習(xí)的地方
- 函數(shù)命名:看上去,閱讀函數(shù)就知道用法
- 簡介的API

參考

后端工程師攻略 第一季迭代進行中:https://space.bilibili.com/10056291/#/channel/detail?cid=53850

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容