String包
在go中的字符串是不可变字节序列,默认是UTF-8编码存储Unicode字符
1、分割字符串函数
主要有:
- SplitN:按指定的字符,将字符串分割,返回指定切片长度
- Split:按指定的字符,将字符串分割
- SplitAfterN:按指定字符分割,但是包含字符,返回指定切片长度
- SplitAfter :按指定字符分割,但是包含字符
- Fields:用于分割字符串,不包括空格(跳过所用空格)
区别前两个都不包含sep,后两个都包含
Split和SplitN函数用于分割字符串,函数原型:
func Split(s, sep string) []string
接收两个参数,s代表原串,sep代表分隔符,返回一个string切片
func SplitN(s, sep string, n int) []string
接收三个参数,s代表原串,sep代表分隔符,n为字段的返回一个长度为n的string切片
如果sep是空则对每一个字符进行拆分
s中没有sep则返回一个长度为一的切片,内容是s
Split示例:
var str string
str = "hello world!"
tmp := strings.Split(str, " ")
fmt.Println(len(tmp), tmp) // 2, hello world
SplitN示例
tmp := strings.SplitN(str, "o ", 3)
for _, v := range tmp{
fmt.Println(v)
}
fmt.Println("tmp len:", len(tmp))
SplitAfter和SplitAfterN函数分割字符串,但是会包含sep
SplitAfter(s, sep string) []string
SplitAfterN(s, sep string, n int) []string
SplitAfter示例:
tmp := strings.SplitAfter(str, "o ")
for _, v := range tmp{
fmt.Println(v)
}
fmt.Println("tmp len:", len(tmp))
SplotAfterN示例:
tmp := strings.SplitAfterN(str, "o ", 3)
for _, v := range tmp{
fmt.Println(v)
}
fmt.Println("tmp len:", len(tmp))
上面四个函数内部都调用函数func genSplit(s, sep string, sepSave, n int) []string
根据n和sep来判断分割情况,sepSave用于表示sep会不会保留,是sep的长度
func genSplit(s, sep string, sepSave, n int) []string {
...
if sep == "" {
return explode(s, n)
}
if n < 0 {
n = Count(s, sep) + 1
}
...
m := Index(s, sep)
....
}
n不能等于0,n必须大于0或者小于0
sep==""时使用explode将s中的字符全部拆分
如果n小于0时需要根据s和sep来计算出s中sep的个数函数是Count
Index返回s中sep的第一个实例索引
2、Index的应用
Index函数用于返回s中substr的下标
func Index(s, substr string) int
不但是一个外部接口也是被内部函数所使用func Contains(s, substr string) bool
Contains用于判断substr是否存在于s中
示例:
func testCtains(str, subStr string){
if strings.Contains(str, subStr){
fmt.Println("Exist",)
} else {
fmt.Println("Not exist")
}
}
和Index相似的函数有
- IndexAny:
IndexAny(s, chars string)
返回chars在s中的找到的第一个实例索引 - LastIndexAny:返回最后一个元素的实例索引,(倒叙)
- LastIndex:返回最后一个实例索引
- LastIndexByte:
LastIndexByte(s string, c byte) int
返回字符c在s中的最后一个实例索引 - IndexByte:返回c在s中第一个实例索引
3、Join函数
将a的字符串连接起来,以sep为间隔符
func Join(a []string, sep string) string
示例:
strs := make([]string, 0)
for i := 0; i < 5; i ++{
strs = append(strs, "hello")
}
str := strings.Join(strs, "-")
fmt.Println(str)
join源码:
func Join(a []string, sep string) string {
switch len(a) {
case 0:
return ""
case 1:
return a[0]
case 2:
// Special case for common small values.
// Remove if golang.org/issue/6714 is fixed
return a[0] + sep + a[1]
case 3:
// Special case for common small values.
// Remove if golang.org/issue/6714 is fixed
return a[0] + sep + a[1] + sep + a[2]
}
//计算出结果字符串的大小
n := len(sep) * (len(a) - 1)
for i := 0; i < len(a); i++ {
n += len(a[i])
}
b := make([]byte, n)
bp := copy(b, a[0])
for _, s := range a[1:] {
bp += copy(b[bp:], sep)
bp += copy(b[bp:], s)
}
return string(b)
}
代码中是根据a的大小来进行操作,小于三时处理方式比较简单使用+
如果len(a)过大时使用遍历