这是我参与「第五届青训营 」伴学笔记创作活动的第 3 天
字符串操作——strings库
strings 包提供了很多操作字符串的简单函数,通常一般的字符串操作需求都可以在这个包中找到。我们常见的字符串常见操作有:
- 字符串长度;
- 求子串;
- 是否存在某个字符或子串;
- 子串出现的次数(字符串匹配);
- 字符串分割(切分)为[]string;
- 字符串是否有某个前缀或后缀;
- 字符或子串在字符串中首次出现的位置或最后一次出现的位置;
- 字符串重复几次;
- 字符串中子串替换;
- 大小写转换;
- ......
1、字符串比较
Compare 函数,用于比较两个字符串的大小,如果两个字符串相等,返回为 0。如果 a 小于 b ,返回 -1 ,反之返回 1 ,但一般直接使用 == != > < >= <= 等一系列运算符会更加直观:func Compare(a, b string) int
EqualFold 函数,计算 s 与 t 忽略字母大小写后是否相等:func EqualFold(s, t string) bool
2、是否存在某个字符或子串
Contains函数:子串 substr 在 s 中,返回 true
func Contains(s, substr string) bool
ContainsAny函数:chars 中任何一个 Unicode 代码点在 s 中,返回 true
func ContainsAny(s, chars string) bool
ContainsRune函数:Unicode 代码点 r 在 s 中,返回 true
func ContainsRune(s string, r rune) bool
3、子串出现次数——字符串匹配
Count 函数,当 sep 为空时,Count的返回值是:utf8.RuneCountInString(s) + 1:
func Count(s, sep string) int
fmt.Println(strings.Count("cheese", "e"))
fmt.Println(len("谷歌中国"))
fmt.Println(strings.Count("谷歌中国", ""))
//输出:
3
12
5
4、字符串分割为[]string
Fields函数:用一个或多个连续的空格分隔字符串 s,返回子字符串的数组(slice)。如果字符串 s 只包含空格,则返回空列表([]string 的长度为 0):
fmt.Printf("Fields are: %q", strings.Fields(" foo bar baz "))
输出结果:
Fields are: ["foo" "bar" "baz"]
Split、SplitAfter、SplitN、SplitAfterN函数都是通过一个同一个内部函数来实现的。这四个函数都是通过 sep 进行分割,返回[]string。如果 sep 为空,相当于分成一个个的 UTF-8 字符,如Split("abc","") ,得到的是[a b c],它们的函数签名及其实现:
func Split(s, sep string) []string { return genSplit(s, sep, 0, -1) }
func SplitAfter(s, sep string) []string { return genSplit(s, sep, len(sep), -1) }
func SplitN(s, sep string, n int) []string { return genSplit(s, sep, 0, n) }
func SplitAfterN(s, sep string, n int) []string { return genSplit(s, sep, len(sep), n) }
Split、SplitAfter的区别:Split 会将 s 中的 sep 去掉,而 SplitAfter 会保留 sep
5、字符串是否有某个前缀或后缀
HasPrefix和HasSuffix函数,源码如下:
// s 中是否以 prefix 开始
func HasPrefix(s, prefix string) bool {
return len(s) >= len(prefix) && s[0:len(prefix)] == prefix
}
// s 中是否以 suffix 结尾
func HasSuffix(s, suffix string) bool {
return len(s) >= len(suffix) && s[len(s)-len(suffix):] == suffix
}
如果 prefix 或 suffix 为 “” , 返回值总是 true。
6、字符或子串在字符串中出现的位置
一系列函数与该功能有关: `
// 在 s 中查找 sep 的第一次出现,返回第一次出现的索引
func Index(s, sep string) int
// 在 s 中查找字节 c 的第一次出现,返回第一次出现的索引
func IndexByte(s string, c byte) int
// chars 中任何一个 Unicode 代码点在 s 中首次出现的位置
func IndexAny(s, chars string) int
// 查找字符 c 在 s 中第一次出现的位置,其中 c 满足 f(c) 返回 true
func IndexFunc(s string, f func(rune) bool) int
// Unicode 代码点 r 在 s 中第一次出现的位置
func IndexRune(s string, r rune) int
// 有三个对应的查找最后一次出现的位置
func LastIndex(s, sep string) int
func LastIndexByte(s string, c byte) int
func LastIndexAny(s, chars string) int
func LastIndexFunc(s string, f func(rune) bool) int
7、字符串 JOIN 操作
将字符串数组(或 slice)连接起来可以通过 Join 实现,函数签名如下:
func Join(a []string, sep string) string
简单使用示例:
fmt.Println(Join([]string{"name=xxx", "age=xx"}, "&"))
//输出结果:
name=xxx&age=xx