大家好,我叫謝偉,是一名程式設計師。
換了工作,一直沒太多精力進行輸出,還是需要花些時間,進行總結,不然對 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/#/…