字符串处理在实际项目应用中是比较常见的,一门好的语言会提供非常全的字符串处理功能,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语言中文网查看其文档自行研究