字符串基本是每个语言里都有的数据类型,这里来记录下go语言里对字符串的操作。
一、字符串的定义与字符串拼接
package main
import "fmt"
var str1 = "Hello" // 定义字符串类型变量
var str2 = ` // 定义多行的字符串类型变量
第一行
第二行
`
func main() {
str3 := "World" // 在函数里定义字符串类型变量
fmt.Println(str1 + " " + str3) // 字符串拼接方式一:用+拼接
fmt.Printf("%s %s", str1, str3) // 字符串拼接方式二:格式化拼接
fmt.Println(str2) // 打印多行字符串变量
}
二、获取字符串长度
fmt.Println(len("This is String"))
三、strings模块对字符串的操作
strings包相关文档地址:https://go-zh.org/pkg/strings/
3.1、字符串切割
fmt.Println(strings.Split("this is a string", " ")) // 对字符串进行分割操作,以空格为分隔符
fmt.Printf("%T\n", strings.Split("this is a string", " ")) // 打印切割后得到的字符串类型,结果为:[]string(字符串切片类型)
3.2、判断是否包含
fmt.Println(strings.Contains("how do you do", "do")) // 判断字符串是否包含字符串"do",包含则返回true,否则返回false
3.3、字符串前后缀判断
fmt.Println(strings.HasPrefix("how do you do", "how")) // 判断前缀,如果字符串是以how开头的则返回true,否则则返回false
fmt.Println(strings.HasSuffix("how do you do", "do")) // 判断后缀,如果字符串是以do结尾的则返回true,否则则返回false
3.4、判断字符串-子串第一次出现的位置和最后一次出现的位置
var s string = "how do you do"
fmt.Println(strings.Index(s, "do")) // 判断变量s里子串do第一次出现的位置(打印下标)
fmt.Println(strings.LastIndex(s, "do")) // 判断变量s里子串do最后出现的位置(打印下标)
3.5、join操作
s3 := []string{"how","do","you","do"}
fmt.Println(s3) // 结果为:[how do you do]
fmt.Println(strings.Join(s3, "+")) // 用加号给s3里的子串连接起来(默认以空格连接),结果为:how+do+you+do
3.6、字符串替换
s := "hehehe World"
fmt.Println(strings.Replace(s,"he","wo",1)) // strings.Replace(要操作的字符串,"需要替换的字符","替换成什么字符",替换几次(1:一次。0:不做替换。-1:全部替换))
3.7、字符串计数
fmt.Println(strings.Count(s,"he")) // strings.Count(s,"he") 打印出字符串"he"在s字符串里出现的次数
3.8、字母转大写与转小写
fmt.Println(strings.ToUpper(s)) // 将s便量里的所有值变大写
fmt.Println(strings.ToLower(s)) // 将s便量里的所有值变小写
3.9、字符串重复
fmt.Println(strings.Repeat(s,3)) // strings.Repeat(s,3) 结果为:得到3次s变量的值
3.10、去掉字符串收尾的空格
s := " this is a string "
fmt.Println(strings.TrimSpace(s)) // 去掉变量s首尾的空格
3.11、去掉指定字符串
fmt.Println(strings.Trim("abbacbadeabcfacb","abc")) // 从前面的字符串里的前后去掉后面匹配的字符串(结果为:deabcf)
fmt.Println(strings.TrimLeft("abbacbadeabcfacb","abc")) // 从前面的字符串里去掉左侧的指定字符串
fmt.Println(strings.TrimRight("abbacbadeabcfacb","abc")) // 从前面的字符串里去掉右侧的指定字符串
3.12、返回空格分割的字符串
fmt.Println(strings.Fields("this is a string")) // 默认按照空格分隔,返回一个切片,结果为:[this is a string]
fmt.Println(strings.Split("this,is,a,string",",")) // 自定义分隔符(以逗号为分隔符),返回一个切片类型,结果为:[this is a string]
四、字符串切片
str := "Hello World"
fmt.Println(str[0:5]) // 根据下标对字符串切片(从下标0切割到下标为5的字符串,顾头不顾尾(下标是5的字符串不获取))
fmt.Println(str[6:]) // 从下标6的字符串开始切割到最后
五、字符串反转
字符串反转没有自带方法,下面我们自己实现一个字符串反转
package main
import (
"fmt"
)
// 字符串反转,方法一
func reverse(str string) string {
var result string // 定义字符串类型变量
strLen := len(str) // 判断字符串长度
for i := 0; i < strLen; i++ {
// 循环:从字符串的最大下标每次减一获取字符串的内容实现字符串反转
result = result + fmt.Sprintf("%c", str[strLen-i-1])
}
// 返回结果
return result
}
// 字符串反转,方法二
func reverse1(str string) string {
var result []byte // 定义数组
tmp := []byte(str) // 将传入的字符串转为数组
strLen := len(str) // 获取传入字符串的长度
for i := 0; i < strLen; i++ { // 循环
result = append(result, tmp[strLen-i-1]) // 根据下标从大到小的顺序往result数组里追加字符串数组的内容
}
return string(result) // 返回字符串类型的result变量
}
func main() {
ret := reverse("Dreams")
ret1 := reverse1("Dreams")
fmt.Println(ret) // 结果:smaerD
fmt.Println(ret1) // 结果:smaerD
}
六、strconv模块对字符串的操作
将整数转换为字符串与将字符串转为整型,strconv包相关文档地址:https://go-zh.org/pkg/strconv/
6.1、Atoi将字符串转换为整型
str := "1234"
retStr, err := strconv.Atoi(str) // Atoi:将字符串转换为整型
if err != nil {
fmt.Println(err)
}
fmt.Printf("Type:%T, data:%d\n", retStr, retStr) // 结果:Type:int, data:1234
6.2、Itoa将整形转换为字符串
int := 3306
retInt := strconv.Itoa(int) // Itoa:将整型转换为字符串
fmt.Printf("Type:%T, data:%s\n", retInt,retInt) // 结果:Type:string, data:3306
6.3、ParseBool()
ret2, _ := strconv.ParseBool("1") // ParseBool(string):返回字符串表示的bool值。它接受1、0、t、f、T、F、true、false、True、False、TRUE、FALSE;否则返回错误。
fmt.Println(ret2) // 结果true
6.4、ParseInt()
ret1, _ := strconv.ParseInt("123", 10, 0) // ParseInt(字符串, 进制(以几进制的形式展示,有效值:2-36),0、8、16、32、64 分别代表 int、int8、int16、int32、int64;)
fmt.Println(ret1) // 结果:123
6.5、ParseUint()
u, err := strconv.ParseUint("2", 10, 64) //ParseUint类似ParseInt但不接受正负号,用于无符号整型。
6.6、ParseFloat()
f, err := strconv.ParseFloat("3.1415", 64)
解析一个表示浮点数的字符串并返回其值。
如果s合乎语法规则,函数会返回最为接近s表示值的一个浮点数(使用IEEE754规范舍入)。
bitSize指定了期望的接收类型,32是float32(返回值可以不改变精确值的赋值给float32),64是float64;
返回值err是*NumErr类型的,语法有误的,err.Error=ErrSyntax;结果超出表示范围的,返回值f为±Inf,err.Error= ErrRange。