func Join(a []string, sep string) string

,连接字符串,以sep作为分隔符

例子:

s := []string{"foo", "bar", "baz"}
fmt.Println(strings.Join(s, ", "))

输出:
foo, bar, baz

,源代码分析

1.判断a的长度,0时,返回空字符串,长度为1时,返回a[0].

2.否则,在变量n中保存将要生产字符串的长度。计算方法len(a)-1个sep的长度 + 数组a中字符串长度和。

3.创建一个长度为n的byte数组。将数据复制到数组中,copy()将返回复制元素的个数,用bp来记录复制的位置。最后转成string返回。

 

func Split(s, sep string) []string

,分割字符串,sep为空字串时,与上一篇讲到的一样,相当于每个字符之间的间隔。s中没有sep,返回值里只有一个元素s。

例子:

fmt.Printf("%q\n", strings.Split("a,b,c", ","))
fmt.Printf("%q\n", strings.Split("a man a plan a canal panama", "a "))
fmt.Printf("%q\n", strings.Split(" xyz ", ""))
fmt.Printf("%q\n", strings.Split("", "Bernardo O'Higgins"))

输出:
["a" "b" "c"]
["" "man " "plan " "canal panama"]
[" " "x" "y" "z" " "]
[""]

,源代码return genSplit(s, sep, 0, -1)

看看func genSplit(s, sep string, sepSave, n int) []string。

func genSplit(s, sep string, sepSave, n int) []string

,有几个函数都用到这个函数,通用分割字符串的函数。

n 是返回分割的个数,-1时,返回所有。

sepSave是被分割的位置在sep所在位置的偏移,被用于SplitAfter和SplitAfterN这些函数,使用len(sep)作为sepsave可以返回sep最后一个字符前面的字串作为一个分割。

1.n为0时,返回nil。

2.sep为空字串,return explode(s, n),

3.当n<0时,应该返回所有,n为Count(s, sep) + 1,表示长度。

4.定义几个变量,c是用于比较是否和sep相等,都是先比较第一个字符。相等再看字符串长度为一,则找到;不为一,比较整个sep。a是被返回的数组,na是在数组中存储的位置。

东西零碎 utf8包的内容,写下来的目的是使自己是真正的明白,而不是一看知道是这么回事,但是不想为什么要这样写。现在感觉自己用来学习的时间很少,珍惜一下。

上一篇:
下一篇:

相关文章:

Categories: 博客记录

0 Responses so far.

Leave a Reply