ZERO_FUCKS.png
大家好,我叫谢伟,是一名程序员。
换了工作,一直没太多精力进行输出,还是需要花些时间,进行总结,不然对 Go 生疏了。
这一季的系列主题,主要围绕内置库进行。如果一个人写的代码比你的赞,那么他对内置库的熟悉程度一定比你强。
对内置库的熟悉,一定程度上能够帮助大家编写更优的代码,如果不熟悉内置的 API,有可能会自己去实现,你自己思考的不一定比内置的实现优。
原则:
熟悉内置 API
补充新知识
弥补的短板
大纲
猜测会提供的用法
函数命名方式:has, is
自己的思路
自己的思路:26 个小写字母,26 个大写字母
大小写转化
是否前缀,后缀
分割
转换
包含
统计
去除指定字符
字符
基本用法
学习到的
定义全局变量
测试数据集合:切片
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 31 can 32 i 13 become 64 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. 直接单词的复数形式: 比如 testcasesfor index, testcase := range testcases{ } 2. 双写字符: 比如 ttfor index, t := range tt { }
匿名结构体
有哪些用途?
1. 全局变量 var globalVar struct { name string age int} globalVar.name = "xieWei"globalVar.age = 202. 测试集合 var test = []struct{ in string out string }{ { in: "1", out: "2", }, }
值得学习的地方
- 函数命名:看上去,阅读函数就知道用法 - 简介的API
作者:谢小路
链接:https://www.jianshu.com/p/b2807ca4444f