Golang源码分析strings.go

Golang源码分析strings.go

📦 1. 文件作用和概述

strings.go 是 Go 标准库 strings 包的主文件,定义了大量用于字符串操作的函数,例如:

  • 比较、查找、分割、拼接

  • 大小写转换

  • 修剪、去空格

  • 替换、重复

bytes 包的功能类似,但 strings 包是专门为 string(不可变的 UTF-8 字符串)设计,而 bytes 包是为 []byte 设计的。


📑 2. 主要类型和函数列表

strings.go 中,你会找到:

  • 类型:

    • Builder → 高效拼接字符串的工具(减少内存分配)

  • 主要函数:

    • 查找类ContainsIndexLastIndexCountHasPrefixHasSuffix

    • 修改类ReplaceRepeatToUpperToLowerTrimTrimSpace

    • 分割拼接类SplitJoinFieldsFieldsFunc


🔍 3. 核心函数源码分析

我挑几个典型函数深入讲。


🔸 func Contains(s, substr string) bool
func Contains(s, substr string) bool {
    return Index(s, substr) >= 0
}
  • 作用:判断 substr 是否在 s 中出现过。

  • 实现细节:直接调用 Index,因为 Index 返回子串位置,若不存在返回 -1


🔸 func Index(s, substr string) int
func Index(s, substr string) int {
    n := len(substr)
    switch {
    case n == 0:
        return 0
    case n == 1:
        return IndexByte(s, substr[0])
    case n == len(s):
        if substr == s {
            return 0
        }
        return -1
    case n > len(s):
        return -1
    case n <= bytealg.MaxLen:
        c := substr[0]
        i := IndexByte(s, c)
        for i >= 0 && i+n <= len(s) {
            if s[i:i+n] == substr {
                return i
            }
            ni := IndexByte(s[i+1:], c)
            if ni < 0 {
                break
            }
            i += ni + 1
        }
        return -1
    }
    return bytealg.IndexString(s, substr)
}
  • 亮点

    • 针对 特殊情况优化

      • 空字符串:立即返回 0。

      • 单字节:用 IndexByte

      • 子串和原串等长:直接比较。

      • 子串比原串长:直接 -1。

      • 小子串(≤ bytealg.MaxLen,一般是 64):用字节逐个比。

    • 否则调用 bytealg.IndexString(底层用优化过的字节算法)。


🔸 type Builder
type Builder struct {
    addr *Builder // 用于检测拷贝
    buf  []byte
}
  • 作用:提供高效的字符串拼接,避免多次分配。

  • 用法示例

    var b strings.Builder
    b.WriteString("Hello, ")
    b.WriteString("world!")
    result := b.String()
  • 亮点

    • 内部用 []byte 缓冲。

    • 检查是否发生了 Builder 拷贝(因为拷贝后内部指针就乱了)。


🔸 func Replace(s, old, new string, n int) string
func Replace(s, old, new string, n int) string {
    if m := Count(s, old); m == 0 || n == 0 {
        return s
    }
    // 计算新字符串长度并分配缓冲区
    // 遍历 s,将 old 替换成 new,最多替换 n 次
}
  • 亮点

    • 先计算匹配次数(用 Count)。

    • 提前分配好新字符串所需容量。

    • 循环替换,最多 n 次。


⚙️ 4. 典型设计亮点与优化细节

提前分配容量ReplaceJoin 等函数,会提前算出所需空间,避免多次扩容。

小串优化 IndexContains 等函数专门优化了长度 ≤64 的小串,提高速度。

不处理 UTF-8 大部分 strings 函数都是按字节(不是按字符)操作的。比如 len(s) 是字节数,s[i] 是字节。要按字符(rune)操作时,用 unicode 包。

bytes 对应 几乎所有 strings 函数都有对应的 bytes 包函数,比如:

  • strings.Indexbytes.Index

  • strings.Replacebytes.Replace


⚠️ 5. 使用上的注意事项

  • strings 操作的字符串是不可变的,任何修改操作都会返回一个新字符串。

  • 如果频繁拼接字符串,Builder 而不是 +

  • 如果处理的是大块数据或大量字节数组,考虑用 bytes.Bufferbytes 包。


总结

分类典型函数优化亮点
查找Contains, Index, HasPrefix小串优化、字节算法
修改Replace, ToUpper, TrimSpace提前分配、按字节操作
分割拼接Split, Join, Fields高效拼接、避免多余分配
拼接工具Builder内部 []byte 缓冲,零拷贝

👉 立即点击链接,开启你的全栈开发之路:Golang全栈开发完整课程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值