『Go 內建庫第一季:strings』

wuxiaoshen發表於2018-10-31

大家好,我叫謝偉,是一名程式設計師。

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

這一季的系列主題,主要圍繞內建庫進行。如果一個人寫的程式碼比你的贊,那麼他對內建庫的熟悉程度一定比你強。

對內建庫的熟悉,一定程度上能夠幫助大家編寫更優的程式碼,如果不熟悉內建的 API,有可能會自己去實現,你自己思考的不一定比內建的實現優。

原則:

  • 熟悉內建 API
  • 補充新知識
  • 彌補的短板

大綱

  • 猜測會提供的用法

    • 大小寫轉化
      • 自己的思路:26 個小寫字母,26 個大寫字母
    • 是否字首,字尾
      • 函式命名方式:has, is
      • 自己的思路
    • 分割
    • 轉換
    • 包含
    • 統計
    • 去除指定字元
    • 字元
  • 基本用法

  • 學習到的

    • 函式命名
      • is
      • has
      • can
      • should
      • ok
      • found
      • done
      • success
    • 多個用複數形式:tests , testcases, tt
    • 匿名欄位
    • 匿名結構體
      • 定義全域性變數
      • 測試資料集合:切片

自己總結的用法

字串是內建的一種重要的資料型別,字串的處理,也是日常編寫程式碼中非常重要的一環。

結合自身的編寫程式碼的經驗,回顧下。

只有自己先回顧,再查閱標準的 API,才能和自己產生聯絡

  • 字串清理
比如爬蟲,經常會處理網頁的原始碼,獲取到的字串中可以夾雜著不需要的字串,那麼這個時候需要進行字串的清理

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

複製程式碼
  • 包含
包含關係:

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

複製程式碼
  • 分割
將原始字串進行按指定一個或者多個字元分割,結果返回一個 陣列型別

複製程式碼
  • 統計
嚴格上屬於包含關係中的一種

複製程式碼
  • 大小寫轉換
這個功能很常見,比如常見搜尋功能,有些系統嚴格區分大小寫,而有些系統不區分大小寫,或者支援模糊搜尋,這種情況下,大小寫的轉換的功能就很適用

複製程式碼

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

對應的函式的具體的用法

  • 字串清理
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

為什麼要多設計其他方法?

  • 部分分割的需求

  • 按要求部分分割的需求

  • 統計

func stringsCount(value string, subString string) int {
	return strings.Count(value, subString)
}
複製程式碼

子串統計會存在什麼問題?

  • 統計的匹配規則設定不一樣的,結果不一樣?
  • 匹配空子串怎麼算?

比如: fivevev , vev 結果是1, 還是2?

  • 大小寫轉換

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

複製程式碼

會不會有疑問:遇到“數值型”的字串怎麼處理?遇到特殊字元怎麼處理?

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

標準核心函式

包含

還存在其他包含函式:

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

字元 和 ASCII 的操作?

var charOne rune = 'a'

fmt.Print(string(charOne), " " , int(charOne))
>> a  97
複製程式碼

統計

採用Rabin-Karp演算法。

  • 統計空字元時,為字串長度值

分割

這裡有兩個比較有意思的函式:

  • 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
複製程式碼

看上去按空格分割,FieldsFunc 則按指定字元分割

字首和字尾

  • HasPrefix
  • HasSuffix

注意:命名

布林型別的建議這些詞

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

替換

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

切片或者陣列轉換為字串

  • 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, 去除字串前後端空格。

其他

  • 如何表示複數形式?
1. 直接單詞的複數形式: 比如 testcases

for index, testcase := range testcases{

}

2. 雙寫字元: 比如 tt

for index, t := range tt {

}


複製程式碼
  • 匿名結構體

有哪些用途?

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",
    },
}
複製程式碼
  • 值得學習的地方
- 函式命名:看上去,閱讀函式就知道用法
- 簡介的API

複製程式碼

參考

後端工程師攻略 第一季迭代進行中:space.bilibili.com/10056291/#/…

相關文章