一、简介
字符串是在编程中一个非常常见的操作,熟悉语言的自带的字符串操作函数能帮助你写出优雅、高效的代码,所以语言中自带的字符串处理函数,大家应该熟练掌握。go中主要操作字符的包是strings,下面就介绍一下go中字符串的相关操作包和工程中使用最多的字符串操作函数示例。
二、编码
1.包含操作,strings中的包含操作主要有两个
func Contains(s, substr string) bool
func ContainsAny(s, chars string) bool
contains函数,当s中包含substr时返回true,测试代码如下:
fmt.Println(strings.Contains("我是中国人", "中国"))
fmt.Println(strings.Contains("seefood", "foo"))
fmt.Println(strings.Contains("seefood", "fo o"))
fmt.Println(strings.Contains("seefood", "sea"))
fmt.Println(strings.Contains("seefood", ""))
fmt.Println(strings.Contains("", ""))
输出结果如下:
true
true
false
false
true
true
从上面测试我们需注意一下几点:
- 函数的两个参数可以传入empty(就是最后一个用例)
- 当函数的第二个参数为empty时,前面的字符串为任意值,返回结果都是true
- 子串需是连续的
- 中文支持良好
ContainsAny函数:如果任何Unicode字符码位在s内,ContainsAny返回true。测试实例如下:
fmt.Println(strings.ContainsAny("我是中国人", "人民"))
fmt.Println(strings.ContainsAny("team", "i"))
fmt.Println(strings.ContainsAny("failure", "ui"))
fmt.Println(strings.ContainsAny("failure", "te"))
fmt.Println(strings.ContainsAny("failure", "发"))
fmt.Println(strings.ContainsAny("foo", ""))
fmt.Println(strings.ContainsAny("", ""))
测试函数输出如下:
true
false
true
true
false
false
false
这个函数我们注意一下几点:
- 当chars参数为empty时,函数永远返回false
- 对中文支持良好
- 在s中包含任意一个chars中的字符时,函数都返回true
2.计数函数
func Count(s, sep string) int
Count计数函数:Count计算s中sep的不重叠实例的数量。测试代码如下:
fmt.Println(strings.Count("cheese", "e"))
fmt.Println(strings.Count("five", ""))
fmt.Println(strings.Count("我是中国人", "中"))
fmt.Println(strings.Count("我是中国人", "人民"))
fmt.Println(strings.Count("我是中国人", ""))
fmt.Println(strings.Count("", ""))
实例结果如下:
3
5
1
0
6
1
这个函数我们注意以下几点:
- 在sep为empty时,返回前面子串的长度加1
- 中文不受影响,返回的是中文的个数
- sep需和s进行连续匹配
3.忽略大小写等于
func EqualFold(s, t string) bool
EqualFold函数:是一个忽略大小写的比较函数,官方文档上面说:s和t解释为utf-8编码,在Unicode下进行忽略大小写判断.
fmt.Println(strings.EqualFold("golang", "GOLANG"))
fmt.Println(strings.EqualFold("go", "lang"))
fmt.Println(strings.EqualFold("go", "go"))
fmt.Println(strings.EqualFold("go", ""))
fmt.Println(strings.EqualFold("", ""))
测试结果如下:
true
false
true
false
true
这个函数需要注意:
- 参数可以是empty,empty可以进行比较
4.字符串分割
func Fields(s string) []string
func Split(s, sep string) []string
func SplitAfter(s, sep string) []string
func SplitAfterN(s, sep string, n int) []string
func SplitN(s, sep string, n int) []string
Fields函数是按照空格进行分割,测试用例如下:
fmt.Printf("Fields are: %q", strings.Fields(" wo are family "))
测试结果如下:
Fields are: [“wo” “are” “family”]
Split字符串分割函数,按照指定的字符进行字符串分割,测试用例如下:
fmt.Printf("%q\n", strings.Split("我是中国人", "中国"))
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” " “]
[””]
这个函数有以下几点需要注意:
- 中文可分割
- 会匹配s中的所有分割符号
- 可用empty对字符串进行分割,分割结果为将每个字符进行分割
SplitAfter函数会保留分割符
fmt.Printf("%q\n", strings.SplitAfter("a,b,c", ","))
fmt.Printf("%q\n", strings.SplitAfter("我是中国人", "中国"))
输入结果如下:
[“a,” “b,” “c”]
[“我是中国” “人”]
SplitAfterN函数可以控制返回数组的长度
fmt.Printf("%q\n", strings.SplitAfterN("a,b,c,d,e", ",", 1))
fmt.Printf("%q\n", strings.SplitAfterN("a,b,c,d,e", ",", 2))
fmt.Printf("%q\n", strings.SplitAfterN("a,b,c,d,e", ",", 3))
fmt.Printf("%q\n", strings.SplitAfterN("a,b,c,d,e", ",", 4))
fmt.Printf("%q\n", strings.SplitAfterN("a,b,c,d,e", ",", 5))
fmt.Printf("%q\n", strings.SplitAfterN("a,b,c,d,e", ",", 6))
fmt.Printf("%q\n", strings.SplitAfterN("a,b,c,d,e", ",", 0))
fmt.Printf("%q\n", strings.SplitAfterN("a,b,c,d,e", ",", -1))
测试结果如下:
[“a,b,c,d,e”]
[“a,” “b,c,d,e”]
[“a,” “b,” “c,d,e”]
[“a,” “b,” “c,” “d,e”]
[“a,” “b,” “c,” “d,” “e”]
[“a,” “b,” “c,” “d,” “e”]
[]
[“a,” “b,” “c,” “d,” “e”]
Tips:
- n>0:最多n个子串;最后一个子串将是剩余为拆分的串;
- n==0:返回空
- n<0:所有分割子串
SplitN函数:和上面的SplitAfterN类似,但是会剔除分隔符,测试实例如下:
fmt.Printf("%q\n", strings.SplitN("a,b,c,d,e,f,g", ",", 1))
fmt.Printf("%q\n", strings.SplitN("a,b,c,d,e,f,g", ",", 2))
fmt.Printf("%q\n", strings.SplitN("a,b,c,d,e,f,g", ",", 3))
fmt.Printf("%q\n", strings.SplitN("a,b,c,d,e,f,g", ",", 4))
fmt.Printf("%q\n", strings.SplitN("a,b,c,d,e,f,g", ",", 5))
fmt.Printf("%q\n", strings.SplitN("a,b,c,d,e,f,g", ",", 6))
fmt.Printf("%q\n", strings.SplitN("a,b,c,d,e,f,g", ",", 7))
fmt.Printf("%q\n", strings.SplitN("a,b,c,d,e,f,g", ",", 8))
fmt.Printf("%q\n", strings.SplitN("a,b,c,d,e,f,g", ",", 0))
fmt.Printf("%q\n", strings.SplitN("a,b,c,d,e,f,g", ",", -1))
实例测试结果如下:
[“a,b,c,d,e,f,g”]
[“a” “b,c,d,e,f,g”]
[“a” “b” “c,d,e,f,g”]
[“a” “b” “c” “d,e,f,g”]
[“a” “b” “c” “d” “e,f,g”]
[“a” “b” “c” “d” “e” “f,g”]
[“a” “b” “c” “d” “e” “f” “g”]
[“a” “b” “c” “d” “e” “f” “g”]
[]
[“a” “b” “c” “d” “e” “f” “g”]
5.子串索引
func Index(s, sep string) int
Index函数返回sep在s中索引的位置,如果存在就返回大于等于0的数,如果不存在返回-1,测试用例如下:
fmt.Println(strings.Index("chicken", "ken"))
fmt.Println(strings.Index("chicken", "dmr"))
fmt.Println(strings.Index("爱喝水的社长", "水"))
fmt.Println(strings.Index("爱喝水的社长", "爱"))
fmt.Println(strings.Index("爱喝水的社长", "喝"))
fmt.Println("中文长度:", len("中"))
测试结果如下:
4
-1
6
0
3
中文长度: 3
大家看,后面的中文是不是有点奇怪,这个我个人认为是中文在go中占用了3个字节的原因~
func IndexRune(s string, r rune) int
这个函数是单个字符的索引函数,测试用例如下:
fmt.Println(strings.IndexRune("food", 'o'))
fmt.Println(strings.IndexRune("爱喝水的社长", '水'))
fmt.Println(strings.IndexRune("爱喝水的社长", '爱'))
fmt.Println(strings.IndexRune("爱喝水的社长", '喝'))
fmt.Println(strings.IndexRune("爱shang喝水的社长", 'h'))
测试结果如下:
1
6
0
3
4
在使用中文的时候,中文也是占3个字符~
func LastIndex(s, sep string) int
LastIndex是从后往前找,找到的第一个匹配的字符的索引,测试代码如下:
fmt.Println(strings.Index("go gopher", "go"))
fmt.Println(strings.LastIndex("go gopher", "go"))
fmt.Println(strings.LastIndex("go gopher", "rodent"))
fmt.Println(strings.LastIndex("爱喝水的社长社长", "社长"))
测试输出如下:
0
3
-1
18
6.连接函数
func Join(a []string, sep string) string
这个函数可以将字符串数组组合为一个字符串,测试用例如下:
fmt.Println(strings.Join([]string{"123", "234", "345"}, "喝水"))
fmt.Println(strings.Join([]string{"社长", "爱喝水", "。"}, ""))
测试结果如下:
123喝水234喝水345
社长爱喝水。
7.替换函数
func Replace(s, old, new string, n int) string
这个函数可以替换s中的某个字符,测试代码如下:
fmt.Println(strings.Replace("oink oink oink", "k", "ky", 2))
fmt.Println(strings.Replace("oink oink oink", "oink", "moo", -1))
fmt.Println(strings.Replace("社长爱喝水", "水", "凉白开", -1))
测试结果如下:
oinky oinky oink
moo moo moo
社长爱喝凉白开
8.大小写转换
func ToLower(s string) string
func ToUpper(s string) string
ToLower函数将字符串转化为小写,测试代码如下:
fmt.Println(strings.ToLower("社长喝水ING"))
测试结果如下:
社长喝水ing
ToUpper函数是将字符串转换为大写,测试代码如下:
fmt.Println(strings.ToUpper("社长喝水ing"))
测试代码如下:
社长喝水ING
9.字符串前后的字符去除
我们在开发的时候,我们都对字符串前面或者后面的空格进行去除,在go中有两个函数可以使用
func Trim(s string, cutset string) string
func TrimSpace(s string) string
Trim函数可以去除字符串开始或者结尾的特定字符,测试代码如下:
fmt.Printf("[%q]\n", strings.Trim(" !!! Achtung !!! ", "! "))
测试结果如下:
[“Achtung”]
TrimSpace函数是去除字符串的开始的空格换行符,测试代码如下:
fmt.Printf("%#v\n", strings.TrimSpace(" \t\n a lone gopher \n\t\r\n"))
测试结果如下:
“a lone gopher”
相同的内容在下面的公众号中也有发布,每天分享一些编程知识与技巧,感兴趣的朋友可以加关注,感谢支持!!