Golang源码分析strings.go
📦 1. 文件作用和概述
strings.go 是 Go 标准库 strings 包的主文件,定义了大量用于字符串操作的函数,例如:
-
比较、查找、分割、拼接
-
大小写转换
-
修剪、去空格
-
替换、重复
与 bytes 包的功能类似,但 strings 包是专门为 string(不可变的 UTF-8 字符串)设计,而 bytes 包是为 []byte 设计的。
📑 2. 主要类型和函数列表
在 strings.go 中,你会找到:
-
类型:
-
Builder→ 高效拼接字符串的工具(减少内存分配)
-
-
主要函数:
-
查找类:
Contains,Index,LastIndex,Count,HasPrefix,HasSuffix -
修改类:
Replace,Repeat,ToUpper,ToLower,Trim,TrimSpace -
分割拼接类:
Split,Join,Fields,FieldsFunc
-
🔍 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. 典型设计亮点与优化细节
✅ 提前分配容量 像 Replace、Join 等函数,会提前算出所需空间,避免多次扩容。
✅ 小串优化 Index、Contains 等函数专门优化了长度 ≤64 的小串,提高速度。
✅ 不处理 UTF-8 大部分 strings 函数都是按字节(不是按字符)操作的。比如 len(s) 是字节数,s[i] 是字节。要按字符(rune)操作时,用 unicode 包。
✅ 与 bytes 对应 几乎所有 strings 函数都有对应的 bytes 包函数,比如:
-
strings.Index↔bytes.Index -
strings.Replace↔bytes.Replace
⚠️ 5. 使用上的注意事项
-
strings操作的字符串是不可变的,任何修改操作都会返回一个新字符串。 -
如果频繁拼接字符串,用
Builder而不是+。 -
如果处理的是大块数据或大量字节数组,考虑用
bytes.Buffer或bytes包。
总结
| 分类 | 典型函数 | 优化亮点 |
|---|---|---|
| 查找 | Contains, Index, HasPrefix | 小串优化、字节算法 |
| 修改 | Replace, ToUpper, TrimSpace | 提前分配、按字节操作 |
| 分割拼接 | Split, Join, Fields | 高效拼接、避免多余分配 |
| 拼接工具 | Builder | 内部 []byte 缓冲,零拷贝 |
👉 立即点击链接,开启你的全栈开发之路:Golang全栈开发完整课程
3万+

被折叠的 条评论
为什么被折叠?



