Go语言之字符串
字符串类型在业务中的应用可以说是最广泛的。
如果声明简短的字符串,可直接使用短变量赋值方法,如图:

如果声明的字符串很长,那么换行写比较直观,要用反引号,如图:

一、计算字符串长度:
Go 语言的内建函数len(),可以用来获取切片、字符串、通道( channel )等的长度。
例如:下面表示获取字符串的长度,如图:

代码执行结果如下:

len()函数的返回值的类型为int , 表示字符串的ASCII 字符个数或字节长度。
上图中字符串a的长度为10个字符,字符串b的长度为15,由于Go 语言的字符串都以UTF- 8 格式保存,每个中文占用3 个字节,因此字符串b的长度为15
如果希望按照正常的一个中文也占用一个字符来计算,可以使用Go语言UTF-8包中的RuneCountlnString()函数, 统计Uncode 字符数量,如图:


一般游戏中在登录时都需要输入名字,而名字一般有长度限制。考虑到国人习惯使用中文做名字,就需要检测字符串UTF- 8 格式的长度。
总结:
- ASCII 字符串长度使用len()函数。
- Unicode 字符串长度使用utf8 .RuneCountlnString()函数。
二、遍历字符串一一获取每一个字符串元素
遍历字符串有两种方式,一种是通过传统的for循环来遍历,还有一种是通过for…range来遍历
1、通过普通for循环遍历每一个ASCII 字符:
遍历ASCII 字符使用for的数值循环进行遍历,直接取每个字符串的下标获取ASCII字符,如图:

代码输出结果如下:

从上图可以看出,for循环遍历方式通过下标(索引)的形式,由于没有使用Unicode ,汉字被显示为乱码,可通过如下方法解决
首先将字符串转换为字节切片,然后在通过for 循环遍历,如图:

运行结果如下:

2、通过for…range遍历,此时字符串中如果含有中文就不会出现乱码,如下:

运行结果如下:

分析:为什么通过for…range遍历不乱码但是通过普通for循环乱码?因为中文字符占3个字节,普通for循环遍历的就是单个字符,所以肯定会乱码,此时就可以通过[]rune(str)将字符串转为rune类型,rune 是类型 int32 的别名,用于存放多字节字符,比如中文
3、获取字符串的某一段字符(截取字符串)
获取字符串的某一段字符是开发中常见的操作。我们一般将字符串中的某一段字符称做: “子串”,英文对应substring
下面例子中使用strings.Index()函数在字符串中搜索另外一个子串,如图:

代码执行结果如下:

4、切割字符串
使用strings库的Split函数实现字符串切割,语法如下:
func Split(s, sep string) []string
- s表示要切割的字符串
- set表示分隔符
- []string:返回类型为字符串切片
下面例子表示将字符串按照冒号为分隔符进行切割,然后打印切片的第一个元素,如图:

运行结果如下:

5、截取字符串,截取部分字符串,返回一个切片,如下:


如果字符串中有中文汉字,需要先将字符串转换为rune数组,然后再截取,否则会乱码,如图:


6、检查字符串是否以指定前缀开头,使用strings包的HasPrefix函数
下面例子判断字符串是否以hello开头,如图:


注:判断是否以hello开头,如果字符串中只有hell,默认也是不匹配的
三、修改字符串:
Go 语言的字符串无法直接修改每一个字符元素,只能通过重新构造新的字符串并赋值给原来的字符串变量实现
例如:下面通过数组和for循环实现修改字符串,将world修改为aaaaa,如图:


上述代码中实际修改的是[]byte, []byte 在Go 语言中是可变的,本身就是一个切片,在完成了对[]byte 操作后,使用string()将[]byte 转为字符串时, 重新创造了一个新的字符串
四、连接字符串:
Go 语言和大多数其他语言一样,使用“+”对字符串进行连接操作,非常直观
1、通过”+”实现字符串拼接,如图:


2、除了加号连接字符串, Go语言中也有类似于StringBuilder 的机制来进行高效的字符串连接,如图:


bytes.Buffer 是可以缓冲并可以往里面写入各种字节数组的。字符串也是一种字节数组,使用WriteString()方法进行写入。将需要连接的字符串,通过调用WriteString()方法,写入stringBuilder 中,然后再通过stringBuilder. String()方法将缓冲转换为字符串。
五、格式化:
六、字符串的其他常用操作
1、通过strings.Replace()函数替换字符串
func Replace(s, old, new string, n int) string
- s:表示要替换的字符串
- old:表示要替换的旧的字符串
- new :表示要替换的新的字符串
- n:如果大于0表示替换前n个出现的old,n=-1表示替换所有
(1)、下面例子表示将a.txt替换为a.pdf,如图:


(2)、下面例子将windows路径下反斜杠\替换为双反斜杠\\,如图:

- 第10行:变量a用反引号来定义windows路径,这样里面的内容就不会被反斜杠\转义,如果用双引号,那就会报错,此时的G、n、g都被前面的\转义了,就不是完整的windows路径,因此要用反引号
- 第12行:在替换的时候,需要将要”\” 使用”\”转义

2、通过strings.Trim来去掉字符串的收尾空格,如图:


3、通过strings.Index来获取指定字符串的索引,如图:


有了这个索引后,我们就可以根据索引对字符串进行截取,比如截图索引后的数据:[index:]
七、不定长字符串
在函数的参数为字符串的时候,可以定义不定长度的字符串,可接收0个或者多个字符串作为参数,并得到一个字符串切片,但是有一个限制,就是这个用法只能用在函数的最后一个参数上,不能出现两个,比如(…string, …int)这种语法是不可以的,会报错
如图:


注:不定长参数也适用int等其他类型


