Go: 字符串
字符串
特性
string是一个值类型,意味着可以是空串但不是nilstring是一个不可变的byte数组,是不可变类型string对象本身可以被取地址,但它的元素不允许- 并且由于本质是字节数组,通过数组访问符
[]访问只能得到byte而不是rune并且也没有char类型 string与[]byte和[N]byte可以相互转换,要修改string需要先转换为字节数组,为了内存安全,转换这一行为会分配新的内存给字节数组- 原始字符串:用反引号包围
字符串操作
由于字符串本质是字节数组,许多数组/切片的操作用于
string是很容易理解的拼接:
Go内置了+和+=字符串运算字符串可以直接通过切片符获取子串,但本质是获取字节数组的切片
len():本质是求字节数组的长度,大部分情况字符是ASCII码因此只需要一个字节copy():拷贝操作按字符处理:先转换成
[]rune,即int32序列再处理按字符遍历:
range的最小单位就是int32,因此:1
2for _, ch := range str {
}这样的遍历是按
rune遍历的
strings
strings是内置的字符串工具包,用于处理utf8字符串
创建与拷贝
Repeat(s string, cnt int) string:按次数拷贝字符串Clone(string) string:拷贝字符串,若不为空则分配内存并返回新的字符串对象Builder结构体:用于通过消耗更小的内存来构建复杂字符串(相比使用+)- 实现了
io.Writer, io.ByteWriter, io.StringWriter接口:通过WriteXxx()方法构建字符串, Grow(n int):预分配内存Reset():重置BuilderString()执行构建Builder不能作为参数传递
- 实现了
Join([]string, rep string) string:拼接字符串切片,分隔串为rep,比+性能更好
比较
Compare(a, b string) int:按字符比较两个字符串,返回1,0,-1EqualFold(s, t string) bool:忽略大小写情况下是否相等
包含与匹配
Contains(s, substr string) bool:判断前者是否包含substr子串ContainsAny(s, chs string) bool:判断前者的字符集是否包含chs字符集Count(s, substr string) int:前者包含多少次后者HasPrefix(s, prefix string) bool:判断前者是否有前缀prefixHasSuffix(s, suffix string) bool:判断前者是否有后缀suffixIndex(s, substr string) int:返回子串第一次出现的位置IndexAny(s, chs string) int:返回字符集第一次出现的位置IndexRune(s, chs rune) int:返回指定unicode字符第一次出现的位置IndexLastXxx:上述三者都有Last版本
分割
Fields(s string) []string:按空格分割字符串,类似splitFieldsFunc(s string, f func(rune) bool) []string:按函数f的返回值决定是否分割1
2
3
4// 等价于`Fileds(s)`:
FiledsFunc(s, func(ch rune) bool {
return ch == ' '
})Split(s, sep string) []string:按子串sep分割SplitN(s, sep string, n int) []string:按子串sep分割,返回值最多n个元素SplitAfter(s, sep string):与Split类似但是会保留分隔子串在每个元素的结尾SplitAfterN(...)
删除与替换
Cut(s, sep string) (before, after string, found bool):删除s中第一次出现的sep,before表示子串位置之前的串,after表示子串位置后的串Map(mapping func(rune) rune, s string) string:遍历替换unicode字符,若mapping返回-1则不进行替换而是直接删除该unicode字符Replace(s, old, new string, n int) string:将s中的old子串替换为new串,共能替换n次,n为负数时表示无限次ReplaceAll(s, old, new string) string:等价于Replace(s, old, new, -1)ToUpper()与ToLower()Trim(s, cutset string) string:删除两端只包含cutset字符集的子串TrimLeft()与TrimRight()TrimPrefix(s, substr string) string与TrimSuffix(...):与上述四者不同,删除完全匹配substr子串的前缀或后缀TrimSpace(s string)TrimFunc(s string, f func(rune) bool)*Replacer:提前指定替换规则后复用,通过NewReplacer(oldnew ...string) *Replacer创建1
2
3import "strings"
var rep = strings.NewReplacer(old1, new1, old2, new2)
str = rep.Replace(str)
strconv
strconv提供基本数据类型与字符串之间转换的工具函数Atoi(s string) (int, error):字符串转整型Itoa(x int) (string, error):整型转字符串ParseBool(string)与FormatBool(bool):布尔值转换ParseFloat(string, bitSize int):字符串转浮点型,bitSize为位数FormatFloat(float64, fmt byte, prec, bitSize int):字符串转浮点型,bitSize为位数fmt:格式化类型prec:精度bitzise:位数