打算把golang的常用包都看一遍,分析一下包的代码,觉得从中会学到golang的编程方法^_^。
func Index(s, sep string) int
返回s中第一次出现sep的位置,如果没有返回-1.
例子:
代码:
fmt.Println(strings.Index("chicken", "ken"))
fmt.Println(strings.Index("chicken", "dmr"))
输出:
4
-1
看源码中index的实现方法,
1.取得sep的长度。如果长度为零,返回0。否则取sep第一个字符。
2.如果长度为1,for循环比较s[i]和sep[0],相等,返回i。都不相等,返回-1。
3.如果长度大于1,for循环比较(先比较s[i]和sep[0],不相等就i++,再比较s[i:i+n] == sep。)成立返回i,否则返回-1。比较的上限是i+n。
相关函数:
func Contains(s, substr string) bool
如果substr在s中,返回true。
代码:
fmt.Println(strings.Contains("seafood", "foo"))
fmt.Println(strings.Contains("seafood", "bar"))
fmt.Println(strings.Contains("seafood", ""))
fmt.Println(strings.Contains("", ""))
输出:
true
false
true
true
源代码中用index函数实现,return Index(s, substr) >= 0。
func LastIndex(s, sep string) int
,返回在s中最后一次出现sep的位置,不存在返回-1。
例子就过了,源代码分析,与index()相似,但是判断的时候是从s的后边向前判断。
func Count(s, sep string) int
,统计sep在s中出现的次数,非重叠的,比如s=“eeee”,sep="ee",结果返回2.
例子:
fmt.Println(strings.Count("cheese", "e"))
fmt.Println(strings.Count("five", "")) // before & after each rune
结果:
3
5
,我对第二个例子不理解,在群里问了一番,开始回答的我没明白。后来第二个给我回答我才明白:这里“”字符串指的就是字符串中每个字符之间的空字符串T_T,函数返回了s中有几个这样的空字符串。后面的英文注释直接看不懂T_T,悲催。现在看应该是每个字符的前面加后面。。。
源代码中“”时,返回utf8.RuneCountInString(s) + 1,这里不用len,我测试了一下对于一个中文len返回的长度是3,这里不符,所以用utf8.RuneCountInString。utf8.RuneCountInString是使用range来遍历的字符串,与len计数不同,一个中文长度为1。
但是在接下来遍历s和sep都是用的len(),也就是说比如
fmt.Println(strings.Count("我的我的", "\x88"))你会得到结果2,这是因为
”我的“会被\xe6\x88\x91\xe7\x9a\x84遍历,你将从中找到\x88。
fmt.Println(strings.Count("five", ""))
然后还是分两种情况,len(sep)=1和大于1两种情况。
上一篇: bootstrap和1kbgrid结合使用
下一篇: golang中strings包学习第二篇
0 Responses so far.