打算把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两种情况。

 

上一篇:
下一篇:

相关文章:

Categories: 博客记录

0 Responses so far.

Leave a Reply