Go: 字符串

字符串

特性

  • string是一个值类型,意味着可以是空串但不是nil
  • string是一个不可变的byte数组,是不可变类型
  • string对象本身可以被取地址,但它的元素不允许
  • 并且由于本质是字节数组,通过数组访问符[]访问只能得到byte而不是rune并且也没有char类型
  • string[]byte[N]byte可以相互转换,要修改string需要先转换为字节数组,为了内存安全,转换这一行为会分配新的内存给字节数组
  • 原始字符串:用反引号包围

字符串操作

  • 由于字符串本质是字节数组,许多数组/切片的操作用于string是很容易理解的

  • 拼接:Go内置了++=字符串运算

  • 字符串可以直接通过切片符获取子串,但本质是获取字节数组的切片

  • len():本质是求字节数组的长度,大部分情况字符是ASCII码因此只需要一个字节

  • copy():拷贝操作

  • 按字符处理:先转换成[]rune,即int32序列再处理

  • 按字符遍历:range的最小单位就是int32,因此:

    1
    2
    for _, 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():重置Builder
    • String()执行构建
    • Builder不能作为参数传递
  • Join([]string, rep string) string:拼接字符串切片,分隔串为rep,比+性能更好

比较

  • Compare(a, b string) int:按字符比较两个字符串,返回10-1
  • EqualFold(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:判断前者是否有前缀prefix
  • HasSuffix(s, suffix string) bool:判断前者是否有后缀suffix
  • Index(s, substr string) int:返回子串第一次出现的位置
  • IndexAny(s, chs string) int:返回字符集第一次出现的位置
  • IndexRune(s, chs rune) int:返回指定unicode字符第一次出现的位置
  • IndexLastXxx:上述三者都有Last版本

分割

  • Fields(s string) []string:按空格分割字符串,类似split

  • FieldsFunc(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中第一次出现的sepbefore表示子串位置之前的串,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) stringTrimSuffix(...):与上述四者不同,删除完全匹配substr子串的前缀或后缀

  • TrimSpace(s string)

  • TrimFunc(s string, f func(rune) bool)

  • *Replacer:提前指定替换规则后复用,通过NewReplacer(oldnew ...string) *Replacer创建

    1
    2
    3
    import "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:位数