go基础:字符串操作

一、简介

字符串是在编程中一个非常常见的操作,熟悉语言的自带的字符串操作函数能帮助你写出优雅、高效的代码,所以语言中自带的字符串处理函数,大家应该熟练掌握。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”

相同的内容在下面的公众号中也有发布,每天分享一些编程知识与技巧,感兴趣的朋友可以加关注,感谢支持!!在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值