字符串处理在实际项目应用中是比较常见的,一门好的语言会提供非常全的字符串处理功能,golang也不例外。


前言

实际项目开发过程中,我们接触最多的就是字符串的处理,字符串函数掌握的越多,对我们开发效率的提升就越多。今天我们就来聊一下golang 中好用的字符串函数。


一、字符串函数是什么?

用来处理字符串数据,实现各种转换或适应各种使用场景

二、有哪些常用的字符串函数

1.len() —— 获取字符串长度

str1 := "hello"
fmt.Printf("字符串的长度为: %v\n", len(str1))

输出结果 :   

字符串的长度为: 5

当字符串有中文字时,一个中文字相当于是三个字节 ,golang的编码统一为utf-8(ascii的字符(字母和数字)占1个字节,汉字占用3个字节)

str2 := "hello世界"
fmt.Printf("字符串长度为:%v\n", len(str2))

输出结果:

字符串长度为:11

2.[]rune —— 中文字符串的遍历

当字符串中有中文时,如果要遍历就需要用到rune的切片,否则中文乱码,如下

str2 := "hello世界"
for i := 0; i < len(str2); i++ {
	fmt.Printf("第%v个字符是:%c\n", i, str2[i])
}

输出结果:

此时就需要使用切片rune进行遍历:

str2 := "hello世界"
r := []rune(str2)
for i := 0; i < len(r); i++ {
	fmt.Printf("第%v个字符是:%c\n", i, r[i])
}

输出结果:

 3.strconv.Atoi() —— 字符串转整数

此函数可以直接将字符串的数字转为整数,但如果字符串不是整数则会报错:

str3 := "100"
num, err := strconv.Atoi(str3)
if nil == err {
	fmt.Printf("字符串转换之后的类型是%T, 结果是:%v\n", num, num)
} else {
	fmt.Println("转换错误:", err)
}

输出结果:

字符串转换之后的类型是int, 结果是:100

假如字符串不是数字:

str3 := "100美元"
num, err := strconv.Atoi(str3)
if nil == err {
	fmt.Printf("字符串转换之后的类型是%T, 结果是:%v\n", num, num)
} else {
	fmt.Println("转换错误:", err)
}

输出结果:

转换错误: strconv.Atoi: parsing "100美元": invalid syntax

4.strconv.Itoa() —— 整数转字符串

num := 100
str5 := strconv.Itoa(num)
fmt.Printf("转换之后的类型是: %T,值为:%v\n", str5, str5)

输出结果为:

转换之后的类型是: string,值为:100

5.[]byte("") —— 字符串转byte切片

str := "这是一个字符串"
bytes := []byte(str)
fmt.Printf("转换之后的类型是:%T, 值是:%v\n", bytes, bytes)

输出结果为:

转换之后的类型是:[]uint8, 值是:[232 191 153 230 152 175 228 184 128 228 184 170 229 173 151 231 172 166 228 184 178]

6.string([]byte{.., ..., ...}) —— byte切片转字符串

str := string([]byte{100, 103, 108})
fmt.Printf("转换之后的类型是:%T,值是:%v\n", str, str)

输出结果为:

转换之后的类型是:string,值是:dgl

7.strconv.FormatInt(100, 2) —— 整数转二、八、十六进制字符串

str2 := strconv.FormatInt(100, 2)
fmt.Printf("100转换成二进制之后的类型是:%T, 值为:%v\n", str2, str2)
str8 := strconv.FormatInt(100, 8)
fmt.Printf("100转换成八进制之后的类型是:%T, 值为:%v\n", str8, str8)
str16 := strconv.FormatInt(100, 16)
fmt.Printf("100转换成十六进制之后的类型是:%T, 值为:%v\n", str16, str16)

输出结果为:

100转换成二进制之后的类型是:string, 值为:1100100
100转换成八进制之后的类型是:string, 值为:144 
100转换成十六进制之后的类型是:string, 值为:64

8.strings.contains(s1, s2) —— 字符串s1是否包含字符串s2

b := strings.Contains("你好,世界", "世界")
fmt.Printf("b的类型是:%T, '你好,世界'是否包含'世界': %v\n", b, b)

输出结果:

b的类型是:bool, '你好,世界'是否包含'世界': true

再看一下不包含的:

b := strings.Contains("你好,世界", "人生")
fmt.Printf("b的类型是:%T, '你好,世界'是否包含'人生': %v\n", b, b)

输出结果:

b的类型是:bool, '你好,世界'是否包含'人生': false

9.strings.Count(s1, s2) —— 统计字符串s1中有几个s2

num := strings.Count("Chinese", "e")
fmt.Printf("num的类型是:%T,值为:%v\n", num, num)

输出结果:

num的类型是:int,值为:2

10.s1==s2 与 strings.EqualFold(s1, s2) —— 判断字符串是否相等

双等号(==)是区分大小写的;strings.EqualFold()是不区分大小写的:

s1 := "123abc"
s2 := "123ABC"
b := strings.EqualFold(s1, s2)
fmt.Printf("b的类型是:%T,值为:%v\n", b, b)
fmt.Println("s1是否是123abc: ", s1 == "123abc")
fmt.Println("s1是否与s2相等:", s1 == s2)

输出结果:

b的类型是:bool,值为:true
s1是否是123abc:  true 
s1是否与s2相等: false

 11.strings.Index(s1, s2) —— 字符串s2在s1中第一次出现的位置

此函数返回的结果是整数,如果存在则返回位置,如果不存在则返回-1:

s1 := "123abc"
s2 := "bc"
s3 := "2f"
index1 := strings.Index(s1, s2)
index2 := strings.Index(s1, s3)
fmt.Printf("index1的类型是:%T,值为:%v\n", index1, index1)
fmt.Printf("index2的类型是:%T, 值为:%v\n", index2, index2)

输出结果:

index1的类型是:int,值为:4
index2的类型是:int, 值为:-1

 12.strings.LastIndex(s1, s2) —— 字符串s2在s1中最后一次出现的位置

此函数返回的结果是整数,如果存在则返回最后一次出现的位置,如果不存在则返回-1:

s1 := "123abc123"
s2 := "123"
s3 := "456"
index1 := strings.LastIndex(s1, s2)
index2 := strings.LastIndex(s1, s3)
fmt.Printf("index1的类型是:%T,值为:%v\n", index1, index1)
fmt.Printf("index2的类型是:%T, 值为:%v\n", index2, index2)

输出结果:

index1的类型是:int,值为:6
index2的类型是:int, 值为:-1

13.strings.Replace(s1, s2, s3, num) —— 替换字符串

将字符串s1中的s2子串替换成s3字符串,num表示希望替换几个,如果num是-1则表示全部替换:

s1 := "123abc123"
s2 := "123"
s3 := "456"
s4 := strings.Replace(s1, s2, s3, 1)
s5 := strings.Replace(s1, s2, s3, -1)
fmt.Printf("s1的类型是:%T,值为:%v\n", s4, s4)
fmt.Printf("s2的类型是:%T, 值为:%v\n", s5, s5)

输出结果:

s1的类型是:string,值为:456abc123
s2的类型是:string, 值为:456abc456

14.strings.Split(s1, s2) —— 将字符串s1按s2分隔拆分成一个数组

s1 := "1,2,3,5,6,9,男,女,未知"
s2 := ","
strArr := strings.Split(s1, s2)
fmt.Printf("strArr的类型是:%T,值为:%v\n", strArr, strArr)
for i := 0; i < len(strArr); i++ {
	fmt.Printf("第%v个是:%v\n", i, strArr[i])
}

输出结果:

strArr的类型是:[]string,值为:[1 2 3 5 6 9 男 女 未知]
第0个是:1
第1个是:2
第2个是:3
第3个是:5
第4个是:6
第5个是:9
第6个是:男
第7个是:女
第8个是:未知

15.strings.ToLower(s1)、strings.ToUpper(s2) —— 将字符串进行大小写转换

str1 := "golang"
str2 := "GO GO GO "
str3 := strings.ToUpper(str1)
str4 := strings.ToLower(str2)
fmt.Printf("str3的类型是:%T,值为:%v\n", str3, str3)
fmt.Printf("str4的类型是:%T,值为:%v\n", str4, str4)

输出结果:

str3的类型是:string,值为:GOLANG
str4的类型是:string,值为:go go go

16.strings.TrimSpace(s1) —— 将字符串s1左右两边的空格去除

str1 := "                              golang                                  "
str2 := strings.TrimSpace(str1)
fmt.Printf("str2的类型是:%T,值为:%v\n", str2, str2)

输出结果:

str2的类型是:string,值为:golang

17.strings.Trim(s1, s2) —— 将字符串s1左右两边指定的字符串s2去除

str1 := "????????????????!!!!!!!!!golang!!!!!!!!??????????????"
str2 := strings.Trim(str1, "?")
str3 := strings.Trim(str2, "!")
fmt.Printf("str2的类型是:%T,值为:%v\n", str2, str2)
fmt.Printf("str2的类型是:%T,值为:%v\n", str3, str3)

输出结果:

str2的类型是:string,值为:!!!!!!!!!golang!!!!!!!!
str2的类型是:string,值为:golang

18.strings.TrimLeft(s1, s2) / strings.TrimRight(s1, s2)—— 分别是去除字符串s1左边/右边指定的字符串s2

str1 := "????????????????golang!!!!!!!!!!!!!!!!!!!!!"
str2 := strings.TrimLeft(str1, "?")
str3 := strings.TrimRight(str2, "!")
fmt.Printf("str2的类型是:%T,值为:%v\n", str2, str2)
fmt.Printf("str2的类型是:%T,值为:%v\n", str3, str3)

输出结果:

str2的类型是:string,值为:golang!!!!!!!!!!!!!!!!!!!!!
str2的类型是:string,值为:golang

19.strings.HasPrefix(s1, s2) / strings.HasSuffix(s1, s2)—— 分别是判断指定的字符串s1是否是以s2开头/结尾

s1 := "sftp://192.168.1.3"
s2 := "abc.jpg"
isSftp := strings.HasPrefix(s1, "sftp")
isJpg := strings.HasSuffix(s2, ".jpg")
fmt.Printf("isSftp的类型是:%T,值为:%v\n", isSftp, isSftp)
fmt.Printf("isJpg的类型是:%T,值为:%v\n", isJpg, isJpg)

输出结果:

isSftp的类型是:bool,值为:true
isJpg的类型是:bool,值为:true

总结


以上就是golang里常用的字符串函数,golang内置函数提供了强大字符串处理库,有兴趣的同学可以到go语言中文网查看其文档自行研究