
大家好,我叫謝偉,是一名程序員。
換了工作,一直沒太多精力進行輸出,還是需要花些時間,進行總結(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)計
- 去除指定字符
- 字符
- 大小寫轉(zhuǎn)化
基本用法
-
學(xué)習(xí)到的
- 函數(shù)命名
- is
- has
- can
- should
- ok
- found
- done
- success
- 多個用復(fù)數(shù)形式:tests , testcases, tt
- 匿名字段
- 匿名結(jié)構(gòu)體
- 定義全局變量
- 測試數(shù)據(jù)集合:切片
- 函數(shù)命名
自己總結(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